我需要创建一个连接到服务器的服务器和客户端。
问题:"服务器正常运行。客户端只能连接到localhost,它无法连接到Internet上的服务器。我希望客户端通过托管服务器的公共IP地址连接到服务器。"
首先,我确保端口已转发并且可以访问我已经测试了端口,其次我完全禁用了服务器计算机上的防火墙。
下面是我正在使用的测试代码:
服务器:没什么特别的简单 - 如果客户端已连接则终止,否则只是等待连接。
public class Server {
public static void main(String args[]) {
try {
ServerSocket srvr = new ServerSocket(52000);
srvr.accept();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
客户端:我已使用 no-ip.com 将服务器的IP掩盖为" biogenserver2.noip.me"。 使用 .getCanonicalHostName(); 将返回ip。
public class Client {
public static void main(String args[]) {
try {
String ip = Inet4Address.getByName("somets.noip.com").getCanonicalHostName();
InetSocketAddress sa = new InetSocketAddress(ip, 52000);
//Socket skt = new Socket("0.0.0.0", 52000); //local - this works fine.
Socket skt = new Socket();
skt.connect(sa);
}
catch(Exception e) {
e.printStackTrace();
}
}
}
当我运行它时,服务器连接正常,但客户端返回"连接超时"例外
任何帮助将不胜感激。感谢。
答案 0 :(得分:2)
<强>答案:强>
“为了清楚起见:您已经检查了端口是否通过公共IP打开,由no-ip返回,当您运行那个小型testclient时,服务器将毫无例外地退出(在不是服务器机器的计算机上) ) - 这是正确的吗?“ - Fildor
<强> TL:DR 强>
不要在同一台计算机上运行客户端和服务器,并且尝试通过公共IP连接到服务器的同一网络然后到您自己的本地网络将导致客户端超时异常 < / p>
我在同一台机器和同一网络上运行客户端和服务器。这导致客户端超时异常。我尝试在不同的计算机和不同的网络上运行客户端,我能够成功连接。
答案 1 :(得分:0)
您的应用使用哪种版本的IP协议?在linux上,您可以使用netstat -tunap | grep 52000
找出它并观察第一个字段是tcp
还是tcp6
。如果是后者,则可能存在IPv6连接问题,您可能希望通过将-Djava.net.preferIPv4Stack=true
指定为JVM来使用IPv4到IPv6。
答案 2 :(得分:-1)
在服务器接受客户端
之前,完成3次握手并且客户端超时可能需要一些时间