Java Socket端口转发



我用Java使用Sockets制作了一款网络游戏。它很好用,除了…只能通过我的局域网。:/我想做的是设置它,这样我就可以启动服务器运行在我的家庭计算机上,发送客户端代码,在一个可执行的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对象。我听说套接字可以是UDP或TCP,这取决于你如何设置它们,或者什么…?我没有做任何类似的事情,我只是实例化它们并传递两个值,然后它们就走了。

在服务器的代码中:

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

所以,我也需要知道如何根据路由器/调制解调器设置的变化相应地更改代码。

"IP"是一个字符串,表示我的计算机的私有IP 192.168.1.10,并且只有当我传递给套接字&考察一下。就像我说的,我有一个调制解调器,它连接到一个路由器,路由器连接到我的电脑。所以,有人能请解释给我(详细地说,因为我是一个新手)我到底要做什么来配置他们,和我要做的改变我的代码?

您必须手动端口转发,或者查看UPnP或NAT-PMP等解决方案来实现自动端口转发。不幸的是,NAT的配置非常麻烦,而且大多数路由器都不支持它。这也不是一项简单的任务,因为您必须支持一系列不同的实现和机制。

设置路由器将一个端口转发到你的机器应该不会太难。关于如何在几乎任何路由器上做到这一点,请参阅http://portforward.com/。

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

对于发行版,您可能希望查看Java Web Start。它将使您的客户端更容易获得应用程序以及自动更新。

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

至于IP地址和端口…为端口使用硬编码值应该是可以的。您需要决定客户端连接到的端口,或者至少是一些默认端口。即便如此,从某些外部配置文件读取该值可能还是有用的。如果你决定分发服务器应用程序让其他人运行服务器,这将使它变得更容易。他们可能想使用不同的端口。

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

除非这是你和一些朋友喜欢的东西,你总是可以通过在聊天会话中提供IP和端口来启动游戏,否则你最好在一家负责DNS解析和网络设置的公司找到一些外部托管解决方案。现在,如果你没有Java EE服务器或数据库之类的需求,你会发现这类东西相当便宜。

编辑:想到别的了。TCP可能适合你的用例,但如果这是一款需要最小延迟和快速输入同步的游戏(如射击或战斗游戏),那么它就不是最佳选择。在这种情况下,UDP会更好。这将导致需要添加某种类型的同步检测或机制来弥补任何丢失的数据包。

最新更新