Java Socket端口转发

我使用套接字在Java中创建了一个联网游戏。 它工作得很好,除了……只能通过我的局域网。 :/我想要做的是设置它,以便我可以启动在家用计算机上运行的服务器,并将客户端代码,在可执行的jar中发送给其他人,让他们能够启动它和通过互联网连接。 但就像…我不知道如何设置我的调制解调器和路由器。 :(我有一个无线清除调制解调器,其配置页面如下所示:

http://sofzh.miximages.com/java/

还有一个Netgear路由器,其页面如下所示:

http://sofzh.miximages.com/java/

现在,在客户端和服务器运行器类中,我将PC的私有IP地址与我选择的端口号一起传递给ServerSocket和Socket对象。 我听说套接字可以是UDP或TCP,具体取决于你如何设置,或者……? 我不做那样的事情,但是我只是实例化它们并传递它们的2个值,然后它们就……

在服务器的代码中:

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

客户代码:

 Socket sock = new Socket(IP, 9001); 

同样,我需要知道如何通过更改路由器/调制解调器设置来相应地更改代码。

“IP”是一个字符串,表示我的计算机的私有IP,192.168.1.10,并且该程序仅在我传递给Socket&ServerSocket的字符串时才有效。 就像我说的,我有一个调制解调器连接到一台连接到我的电脑的路由器。 那么,有人可以向我解释(详细说明,因为我是一个菜鸟)我究竟需要做些什么来配置它们,以及我必须对我的代码进行的更改?

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

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

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

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

让服务器的IP地址(你的)在代码中硬编码肯定是禁止的。 客户端应使用他们需要在某个配置文件中提供或设置的IP地址或主机名进行连接。 如果您没有静态IP地址,则需要主机名。

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

编辑:想到别的东西。 TCP可能对你的用例没问题,但如果这是一个需要最小延迟和快速输入同步的游戏(比如射击游戏或格斗游戏),那么它不是最好的选择。 在那种情况下,UDP会更好。 这将导致需要为desync添加某种检测或者补偿任何丢弃的数据包的机制。

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

但是,设置路由器将一个端口转发到您的计算机应该不会太困难。 请参阅http://portforward.com/ ,了解如何在几乎任何路由器上执行此操作的绝佳列表。