我写了一个简单的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,我将得到答案。
我真的不知道为什么会出现这个问题。
抱歉英语不好;)
答案 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);
}