连接到公共ip地址的Java套接字
我需要制作一个连接到服务器的服务器和客户端 问题:“服务器正常工作。客户端只能连接到本地主机,无法连接到internet上的服务器。我希望客户端通过服务器所在的公共ip地址连接到服务器。” 首先,我已经确保端口是转发的并且可以访问,我已经测试了端口,其次我已经从服务器机器上完全禁用了防火墙 下面是我正在使用的测试代码: 服务器:简单-如果客户端已连接,则终止,否则仅等待连接连接到公共ip地址的Java套接字,java,sockets,networking,server,client,Java,Sockets,Networking,Server,Client,我需要制作一个连接到服务器的服务器和客户端 问题:“服务器正常工作。客户端只能连接到本地主机,无法连接到internet上的服务器。我希望客户端通过服务器所在的公共ip地址连接到服务器。” 首先,我已经确保端口是转发的并且可以访问,我已经测试了端口,其次我已经从服务器机器上完全禁用了防火墙 下面是我正在使用的测试代码: 服务器:简单-如果客户端已连接,则终止,否则仅等待连接 public class Server { public static void main(String args[])
public class Server {
public static void main(String args[]) {
try {
ServerSocket srvr = new ServerSocket(52000);
srvr.accept();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
客户端:我曾经将服务器的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();
}
}
}
当我运行此命令时,服务器连接正常,但客户端返回“连接超时”异常
任何帮助都将不胜感激。谢谢。应用程序使用的IP协议版本是什么?在linux上,您可以通过
netstat-tunap | grep52000
来了解它,并观察第一个字段是tcp
还是tcp6
。如果是后者,则可能存在IPv6连接问题,您可能希望通过向JVM指定-Djava.net.preferIPv4Stack=true
,将IPv4改为IPv6。答案:
“为了清楚起见:您已经检查了端口是否通过公共IP打开(由no IP返回),并且当您运行小testclient(在非服务器机器的机器上)时,服务器将毫无例外地退出)-正确吗?”——” TL:DR 不要在同一台计算机和同一网络上运行客户端和服务器,尝试通过公用ip连接到服务器,然后连接到自己的本地网络将导致客户端超时异常
我在同一台机器和同一个网络上运行客户机和服务器。这导致客户端超时异常。我尝试在不同的机器和网络上运行客户端,并成功连接 你有没有试着保持连接一段时间?与服务器代码do
sockets=srvr.accept()类似编码>然后线程睡眠(100)代码>我怀疑连接没有足够的时间完成握手。是的,事实上,同样的问题仍然存在。当通过localhost连接时,它所连接的任何代码都没有问题。我也试过skt.connect(sa,50000);正如somone在下面所建议的,但我仍然得到了相同的结果。只是为了清楚起见:您已经检查了端口是否通过公共IP打开(由no IP返回),并且当您运行小testclient(在非服务器机器的机器上)时,服务器将毫无例外地退出-正确吗?正确,但“不”在不是服务器计算机的计算机上。我在一台机器上运行这两个。我开始认为,这可能是问题所在。不客气!仍然奇怪的是,它在同一台机器上超时了……Inet4Address解决了这个问题,所以我不需要,我没有ipv6,所以它应该改为使用ipv4——这不是问题所在。