Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java套接字端口转发_Java_Sockets_Portforwarding - Fatal编程技术网

Java套接字端口转发

Java套接字端口转发,java,sockets,portforwarding,Java,Sockets,Portforwarding,我使用套接字用Java制作了一个网络游戏。它工作得很好,除了。。。只有通过我的局域网。:/我想做的是设置它,这样我就可以启动运行在家用计算机上的服务器,并将客户机代码以可执行jar的形式发送给其他人,让他们能够启动它并通过互联网进行连接。但是就像。。。我不知道如何为此设置调制解调器和路由器:(我有一个无线透明调制解调器,其配置页面如下所示: 以及Netgear路由器,其页面如下所示: 现在,在客户端和服务器运行程序类中,我将PC的私有IP地址和选择的端口号一起传递给ServerSocket和

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

以及Netgear路由器,其页面如下所示:

现在,在客户端和服务器运行程序类中,我将PC的私有IP地址和选择的端口号一起传递给ServerSocket和Socket对象。我听说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的字符串时,程序才会工作。正如我所说,我有一个调制解调器,它连接到一个路由器,路由器连接到我的计算机。所以,有人能给我解释一下吗(详细地说,因为我是一个noob)要配置这两个端口以及对代码所做的更改,我到底需要做些什么?

您必须手动向前移植,或者查看类似UPnP或NAT-PMP的自动端口转发解决方案。不幸的是,NAT是一个很难配置的问题,大多数路由器都不正确支持它。这也不是一个简单的task,因为您必须支持一系列不同的实现和机制


不过,将路由器设置为将一个端口转发到您的计算机应该不会太困难。请参阅一个关于如何在几乎所有路由器上执行此操作的精彩列表。

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

对于发行版,您可能希望查看。这将使您的客户更容易获得应用程序以及自动更新

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

至于IP地址和端口…使用硬编码的端口值应该可以。您需要决定客户端要连接的端口或至少一些默认端口。即使如此,从一些外部配置文件读取该值可能会很有用。如果您决定将服务器应用分发给让其他人运行服务器。他们可能希望使用其他端口

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

除非这是你和一些朋友可以享受的东西,你可以通过在聊天会话中提供IP和端口之类的方式启动游戏,否则你最好在一家为你提供DNS解析和网络设置的公司找到一些外部托管解决方案。现在你会发现类似这样的东西p如果您没有像JavaEE服务器或数据库这样的需求

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