我正在构建一个简单的服务器应用程序,我可以在本地网络中连接到它。但我无法通过互联网连接。
这是我的服务器代码:
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。
当我运行客户端时,我得到“connecting...”字符串,它卡在那里。我没有得到“连接!”或堆栈跟踪。但正如我之前所说,它确实适用于本地网络。它在连接到 127.0.0.1 和使用 192.168.1.90 时有效。
我用了CanYouSeeMe.org检查端口是否打开。 80端口成功,4000超时。
最佳答案
查看4000端口绑定(bind)的是哪个ip地址。它可能只绑定(bind)到环回地址(127.0.0.1)而不是任何接口(interface)。
不确定您使用的是哪个操作系统,但要检查: Linux:netstat -ant Windows 和 Mac:netstat -anp tcp
在端口 4000 上查找 LISTEN 行,看看它是绑定(bind)到所有接口(interface)(*:4000 或 0.0.0.0:4000),还是绑定(bind)到特定接口(interface) (127.0.0.1:4000)。
如果它没有监听所有接口(interface),那是你的问题 - 使用允许你指定 BindAddress 的构造函数。
关于Java:将端口转发到 ServerSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1983747/