我使用套接字在Java中创建了一个联网游戏。它工作得很好,除了......只能通过我的局域网。 :/我想要做的是设置它,以便我可以启动在我的家用计算机上运行的服务器,并将客户端代码,在可执行的jar中发送给其他人,让他们能够启动它和通过互联网连接。但就像......我不知道如何设置我的调制解调器和放大器路由器。 :(我有一个无线清除调制解调器,配置页面看起来像这样:
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,具体取决于你如何设置它们,或者......?我不做那样的事情,但是我只是实例化它们并将它们传递给它们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的。就像我说的,我有一个调制解调器连接到一台连接到我的电脑的路由器。那么,有人可以向我解释(详细说明,因为我是菜鸟)我究竟需要做些什么来配置它们,以及我必须对我的代码进行哪些更改?
答案 0 :(得分:2)
您必须手动移植,或者查看UPnP或NAT-PMP等解决方案以进行自动端口转发。不幸的是,NAT配置很麻烦,大多数路由器都没有正确支持它。这也不是一项简单的任务,因为您必须支持各种不同的实现和机制。
设置路由器将一个端口转发到您的计算机应该不会太困难。请参阅http://portforward.com/,了解如何在几乎任何路由器上执行此操作的绝佳列表。
答案 1 :(得分:0)
听起来你在这里问了很多问题......我不是网络/套接字编程专家,但这里有一些想法。
有关分发,您可能希望查看Java Web Start。它将使您的客户轻松获得应用程序以及自动更新。
如果你正在使用这样的Socket
构造函数,那么实际的实现将是系统默认的。您可以通过使用合适的SocketImplFactory
实施方式调用this method来覆盖此内容。
对于IP地址和端口......使用端口的硬编码值应该没问题。无论如何,您都需要决定一个端口或至少一些默认设置才能连接到客户端。即便如此,从某些外部配置文件中读取值也许很有用。如果您决定分发服务器应用程序以让其他人运行服务器,这将使您更容易。他们可能想要使用不同的端口。
让服务器的IP地址(你的)在代码中硬编码绝对是禁止的。客户端应使用他们需要在某个配置文件中提供或设置的IP地址或主机名进行连接。如果您没有静态IP地址,则需要主机名。
除非这是你和一些朋友喜欢的东西,你可以随时通过在聊天会话中提供IP和端口来启动游戏,你最好在一家公司找到一些外部托管解决方案。为您处理DNS解析和网络设置。如果你没有像Java EE服务器或数据库这样的要求,现在你会发现这样的东西非常便宜。
编辑:想到别的东西。 TCP可能适用于您的用例,但如果这是一款需要最小延迟和快速输入同步的游戏(如射击游戏或格斗游戏),那么它不是最佳选择。在那种情况下,UDP会更好。这将导致需要为desync添加某种检测或者补偿任何丢弃数据包的机制。