Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java getLocalAddress()返回0.0.0.0_Java_Sockets_Udp - Fatal编程技术网

Java getLocalAddress()返回0.0.0.0

Java getLocalAddress()返回0.0.0.0,java,sockets,udp,Java,Sockets,Udp,我试图写一个程序使用套接字,我需要得到自己的本地IP地址 当我在套接字中使用getLocalAddress时,我只得到0.0.0.0 下面是我的一段代码: DatagramSocket socket; DatagramPacket pacoteEnvio = new DatagramPacket(msgByte, msgByte.length, addr, 6500); socket = new DatagramSocket(); System.out.println("Local addres

我试图写一个程序使用套接字,我需要得到自己的本地IP地址

当我在套接字中使用getLocalAddress时,我只得到0.0.0.0

下面是我的一段代码:

DatagramSocket socket;
DatagramPacket pacoteEnvio = new DatagramPacket(msgByte, msgByte.length, addr, 6500);
socket = new DatagramSocket();
System.out.println("Local address = " + socket.getLocalAddress());
socket.send(pacoteEnvio);
你知道吗

我正在使用UDP,所以我不确定我是否可以通过这种方式获得我的IP,因为它是无连接的,但我想你可以帮助我

您可以尝试:

InetAddress ip=InetAddress.getLocalHost()

公共DatagramSocket(int端口, 地址(laddr) 抛出SocketException

创建绑定到指定本地地址的数据报套接字。本地端口必须介于0和65535之间(含0和65535)。如果IP地址是0.0.0.0,套接字将绑定到通配符地址,这是内核选择的IP地址


虽然DatagramSocket未连接,但它不绑定本地计算机上的任何端口,因此其IP为0.0.0.0。尝试与套接字建立连接。连接(SocketAddress addr),然后您将得到正确的结果。在
socket.disconnect()
方法之后,您将获得相同的0.0.0.0 ip地址。

使用这样的机制获取本地地址通常不会以您期望的方式工作。一个系统通常至少有两个地址-
127.0.0.1
nic的ip地址
,当您绑定到一个用于监听的地址时,您将绑定到INADR\u ANY,该地址与绑定到
127.0.0.1
nic的ip地址相同。考虑一个带有有线和无线网卡的笔记本电脑,或者两者都可以同时连接。在这种情况下,哪个将被视为系统的IP地址

我偷了答案的一个子集,它处理所有NIC的地址,它列出了所有接口的IP地址,在我的系统上我有10个接口,所以我得到了很多IP地址

try {
  System.out.println("Full list of Network Interfaces:");
  for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
      NetworkInterface intf = en.nextElement();
      System.out.println("    " + intf.getName() + " " + intf.getDisplayName());
      for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
          System.out.println("        " + enumIpAddr.nextElement().toString());
      }
  }
} catch (SocketException e) {
  System.out.println(" (error retrieving network interface list)");
}
试试看{
System.out.println(“网络接口的完整列表:”);
对于(枚举en=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){
NetworkInterface intf=en.nextElement();
System.out.println(“+intf.getName()+”+intf.getDisplayName());
对于(枚举Enumeration EnumipAddress=intf.getInetAddresses();EnumipAddress.hasMoreElements();){
System.out.println(“+enumIpAddr.nextElement().toString());
}
}
}捕获(SocketException e){
System.out.println(“(检索网络接口列表时出错)”;
}
一般来说,如果您正在进行服务器编程,当您在UDP服务上收到数据包时,它包含发送方的IP地址,您只需将响应发送到该地址,并且计算机足够智能,可以将其从正确的网络接口发送出去。

的javadoc对此进行了说明

返回-套接字绑定到的本地地址,如果套接字已关闭,
null
,或者如果套接字未绑定,或者安全管理器
checkConnect
方法不允许该操作,则返回表示通配符地址的
InetAddress

如果使用no args构造函数创建一个
DatagramSocket
,则会得到一个未绑定的套接字,因此(根据javadoc)
getLocalAddress()
应该返回通配符IP地址
0.0.0
。确实如此


通过阅读文档,您可以了解到令人惊讶的事情:-)

我正在从事一个类似的项目——贝尔福德曼客户项目。我一开始试过你的方法,也得到了0.0.0.0。然后,我通过使用InetAddress方法将地址作为字符串输出,而不涉及数据报套接字来解决这个问题

String localIP = InetAddress.getLocalHost().getHostAddress();
System.out.println(localIP);

我显示了我的内部IP——分配给路由器的IP。这对我来说已经足够了。希望这有帮助

您的套接字未绑定,这解释了0地址我试图绑定它进行测试,但收到消息:它已绑定..但我正在广播,因此没有任何地址可连接。请尝试连接到localhost(在那里找到可用端口)