Java Socket端口转发

我使用套接字在
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& S的字符串时才有效. ServerSocket的.就像我说的,我有一个调制解调器连接到一台连接到我的电脑的路由器.所以,有人可以向我解释(详细说明,因为我是一个菜鸟)我究竟需要做什么来配置它们,以及我必须对我的代码进行的更改?

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

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

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

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

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

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

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

点赞