2011-11-17 55 views
3

我使用套接字在Java中制作了一个网络游戏。它工作的很好,除了......只通过我的局域网。 :/我想要做的就是设置它,这样我就可以启动在家用计算机上运行的服务器,并将客户端代码以可执行的jar形式发送给其他人,并让他们能够启动它并通过互联网连接。但就像...我不知道如何设置我的调制解调器&路由器。 :(我有一个无线调制解调器清晰,为其配置页看起来是这样的:Java套接字端口转发

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

而且美国网件路由器,它的页面看起来是这样的:

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

眼下,在客户端和服务器运行器类中,我将PC的私有IP地址和我选择的端口号一起传递给ServerSocket和Socket对象。我听说Sockets可以是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的字符串时起作用。就像我说的,我有一台调制解调器连接到连接到我的电脑的路由器。所以,有人可以请我解释一下(详细地说,因为我是一个noob),我需要做什么来配置它们,以及我必须对我的代码进行的更改?

回答

0

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

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

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

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

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

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

编辑:想到别的东西。 TCP可能适合你的用例,但如果这是一个需要最小延迟和快速输入同步的游戏(如射手或格斗游戏),那么它不是最好的选择。在这种情况下,UDP会更好。它会引发添加某种检测的要求,以便对任何丢失的数据包进行脱机或弥补机制。

1

您必须手动端口转发,或查看类似UPnP或NAT-PMP的解决方案以实现自动端口转发。不幸的是,NAT是配置的麻烦,大多数路由器不能正确支持它。这也不是一个简单的任务,因为您必须支持各种不同的实现和机制。

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