Java套接字端口转发

4
我用Socket在Java中制作了一个网络游戏。它很好用,但是只能在我的局域网内使用。:/ 我想要做的是设置服务器在我的家庭电脑上运行,并将客户端代码打包成可执行的jar文件发送给其他人,让他们通过互联网连接。但是...我不知道如何为此设置我的调制解调器和路由器。:( 我有一个无线Clear调制解调器,其配置页面如下:

http://imageshack.us/photo/my-images/254/modem.jpg

还有一个 Netgear 路由器,其页面看起来像这样:

http://imageshack.us/photo/my-images/443/routerq.jpg

现在,在客户端和服务器运行器类中,我将我的PC的私有IP地址和所选的端口号传递给ServerSocket和Socket对象。我听说Socket可以是UDP或TCP,这取决于你如何设置它们,或者其他什么...?但我没有做任何类似的事情,我只是实例化它们并传递这两个值,然后它们就开始工作了...

在服务器的代码中:

ServerSocket sock = new ServerSocket();
sock.bind(new InetSocketAddress(IP, 9001));

客户端代码:
Socket sock = new Socket(IP, 9001);

所以,我需要知道如何根据我的路由器/调制解调器设置的更改相应地更改代码。 “IP”是一个字符串,表示我的计算机的私有IP地址192.168.1.10,只有在将该字符串传递给Socket和ServerSocket时,程序才能正常工作。就像我说的,我有一个连接到路由器的调制解调器,它连接到我的计算机。那么,有人可以请详细解释一下我需要做什么来配置它们两个,并且我需要对我的代码进行哪些更改吗?
2个回答

2
您需要手动进行端口转发,或者使用UPnP或NAT-PMP等自动端口转发解决方案。不幸的是,NAT配置起来很麻烦,大多数路由器也无法正确支持它。这也不是一个简单的任务,因为您必须支持各种不同的实现和机制。
不过,将一个端口转发到您的机器上应该不会太难。请参见http://portforward.com/,了解如何在几乎任何路由器上设置端口转发的详细步骤。

0

听起来你在这里问了很多问题...我不是网络/套接字编程专家,但这里有一些想法。

对于分发,您可能希望查看Java Web Start。它将使客户端轻松获取应用程序并自动更新。

如果您像那样使用Socket构造函数,则实际实现将是系统默认值。您可以通过使用适当的SocketImplFactory实现调用this method来覆盖此值。

至于IP地址和端口...对于端口,使用硬编码值应该没问题。您需要决定一个端口或至少一些默认值供客户端连接。即便如此,从某些外部配置文件中读取该值可能会很有用。这将使您更容易地将服务器应用程序分发给其他人运行服务器。他们可能想使用不同的端口。

在代码中硬编码服务器的IP地址绝对是不可取的。客户端应该使用他们需要提供或在某个配置文件中设置的IP地址或主机名进行连接。如果您没有静态IP地址,则需要主机名。

除非这只是为您和一些朋友享受的东西,在聊天会话或其他方式中,您可以始终通过提供IP和端口来启动游戏,否则最好在一家为您处理DNS解析和网络设置的公司找到一些外部托管解决方案。如果您没有像Java EE服务器或数据库这样的要求,现在您会发现这样的东西非常便宜。

编辑:想到了另一件事。TCP可能适用于您的用例,但如果这是一个需要最小延迟和快速输入同步(如射击或格斗游戏)的游戏,则不是最佳选择。在这种情况下,UDP更好。它将引入添加某种检测失步或弥补任何丢失数据包的机制的要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接