我正在构建一个简单的服务器应用程序,我可以在本地网络中连接它。但我无法通过互联网连接。
这是我的服务器代码:
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时超时。
答案 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规则。