繁体   English   中英

Java套接字端口转发

[英]Java Socket port forwarding

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

http://imageshack.us/photo/my-images/254/mo​​dem.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的字符串,并且仅当该字符串是我传递给Socket&ServerSocket的字符串时,该程序才有效。 就像我说的,我有一个调制解调器,它连接到与计算机相连的路由器上。 因此,有人可以向我解释一下(因为我是一个菜鸟)(详细地讲,因为我是菜鸟),要配置它们和配置代码所做的更改到底需要做什么?

您将必须手动进行端口转发,或者使用诸如UPnP或NAT-PMP之类的解决方案来实现自动端口转发。 不幸的是,NAT在配置方面很麻烦,并且大多数路由器不正确地支持它。 这也不是一件容易的事,因为您必须支持各种不同的实现和机制。

不过,设置路由器将一个端口转发到您的机器应该并不难。 有关如何在几乎所有路由器上执行此操作的出色列表,请参见http://portforward.com/

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

为了进行分发,您可能希望研究Java Web Start 这将使您的客户轻松获取应用程序以及自动执行更新。

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

至于IP地址和端口,则可以为端口使用硬编码值。 无论如何,您都需要决定一个端口或至少一些默认端口,以便客户端连接。 即使这样,从某些外部配置文件中读取值可能还是有用的。 如果您决定分发服务器应用程序以允许其他人运行服务器,这将使工作更加轻松。 他们可能想要使用其他端口。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM