Java:将端口转发到ServerSocket

时间:2009-12-31 03:05:39

标签: java networking sockets

我正在构建一个简单的服务器应用程序,我可以在本地网络中连接它。但我无法通过互联网连接。

这是我的服务器代码:

ServerSocket server;
try {
    server = new ServerSocket(4000);
} catch(IOException ex) {
    System.out.printf("Could not bind socket 4000\n");
    System.exit(1);
}

try {
    Socket socket = server.accept();
    ClientThread client = new ClientThread(socket);
    client.start();
} catch(IOException ex) {
}

这是客户:

try {
    System.out.printf("connecting...\n");
    Socket socket = new Socket("mydomain.org", 4000);
    System.out.printf("connected!\n");
} catch(UnknownHostException ex) {
    ex.printStackTrace();
} catch(IOException ex) {
    ex.printStackTrace();
}

我已经在我的路由器上转发了端口4000,这应该可行。我之前转发了其他端口,如80和22。

当我运行客户端时,我得到了“连接...”字符串,它挂在那里。我没有“连接!”或堆栈跟踪。但就像我之前说过的那样,它确实可以在本地网络上运行。它在连接到127.0.0.1和使用192.168.1.90时起作用。

我用CanYouSeeMe.org检查端口是否打开。它在80端口上获得了成功,但它在4000时超时。

3 个答案:

答案 0 :(得分:2)

检查绑定的IP地址端口4000。它可能只绑定到环回地址(127.0.0.1)而不是任何接口。

不确定您正在使用哪个操作系统,但要检查: linux:netstat -ant windows和mac:netstat -anp tcp

在端口4000上查找LISTEN行,看看它是否绑定到所有接口(*:4000或0.0.0.0:4000),或绑定到特定接口(127.0.0.1:4000)。

如果它没有监听所有接口,那就是你的问题 - 使用允许你指定BindAddress的构造函数。

答案 1 :(得分:0)

您已经完成了实验,以证明它不是您的java,因此必须是防火墙或防火墙问题。即使您正确地将端口转发到服务器,服务器防火墙也可能不允许入站连接,因此请检查它。

答案 2 :(得分:0)

您有防火墙规则丢弃传入的数据包。这就是你的客户端挂起的原因。检查服务器计算机和任何网关系统上的IP规则。