连接到公共ip地址的Java套接字

连接到公共ip地址的Java套接字,java,sockets,networking,server,client,Java,Sockets,Networking,Server,Client,我需要制作一个连接到服务器的服务器和客户端 问题:“服务器正常工作。客户端只能连接到本地主机,无法连接到internet上的服务器。我希望客户端通过服务器所在的公共ip地址连接到服务器。” 首先,我已经确保端口是转发的并且可以访问,我已经测试了端口,其次我已经从服务器机器上完全禁用了防火墙 下面是我正在使用的测试代码: 服务器:简单-如果客户端已连接,则终止,否则仅等待连接 public class Server { public static void main(String args[])

我需要制作一个连接到服务器的服务器和客户端

问题:“服务器正常工作。客户端只能连接到本地主机,无法连接到internet上的服务器。我希望客户端通过服务器所在的公共ip地址连接到服务器。”

首先,我已经确保端口是转发的并且可以访问,我已经测试了端口,其次我已经从服务器机器上完全禁用了防火墙

下面是我正在使用的测试代码:

服务器:简单-如果客户端已连接,则终止,否则仅等待连接

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——这不是问题所在。