Java Server和Client在本地工作,但不能通过ip工作

时间:2015-01-12 17:49:08

标签: java ip client-server localhost portforwarding

我写了一个简单的Java服务器客户端程序。当我在Socket的构造函数中使用“localhost”作为地址时它可以正常工作,但是当我指定实际的IP时它会失败。因此我认为问题不在Java代码中。 我转发了我的路由器上的端口(来自德国提供商Telekom的Speedport w921v)。在Windows 7上,我拒绝了每个防火墙。我在Ubuntu 14上也尝试过。我使用了正确的ip而不是像127这样的本地ip。或192 ..当输入sudo netstat -tulpe时,我发现这条记录可能属于我的程序

tcp        0      0 *:10300                 *:*                     LISTEN      

10300是我给服务器server = new ServerSocket(10300);

的端口

当我尝试通过telnet xx.xxx.xx.xxx 10300与端口通信时,我无法得到任何响应,但如果我输入telnet localhost 10300,我将得到答案。

我真的不知道为什么会出现这个问题。

抱歉英语不好;)

2 个答案:

答案 0 :(得分:0)

ServerSocket()构造函数和bind()用于您要使用的特定IP和端口。您的计算机可能是多线程的,并且您的Java服务器程序可能只监听特定的网络地址,即使您没有指定实际地址。

答案 1 :(得分:-1)

对于那些来这里寻找类似问题解决方案的人,我找到了一个解决方案 here

问题可能是OP希望从Java获取IP,但计算机可能有多个IP地址。因此,一种解决方案是从AWS获取(全局)IP,如here所示。

URL url = new URL("http://checkip.amazonaws.com/");  
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
System.out.println(br.readLine());

或者,您可以获得here所示的(本地)IP(对我有效)。

String ip;
try {
    Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
    while (interfaces.hasMoreElements()) {
        NetworkInterface iface = interfaces.nextElement();
        // filters out 127.0.0.1 and inactive interfaces
        if (iface.isLoopback() || !iface.isUp())
            continue;

        Enumeration<InetAddress> addresses = iface.getInetAddresses();
        while(addresses.hasMoreElements()) {
            InetAddress addr = addresses.nextElement();
            ip = addr.getHostAddress();
            System.out.println(iface.getDisplayName() + " " + ip);
        }
    }
} catch (SocketException e) {
    throw new RuntimeException(e);
}