Java getLocalAddress()返回0.0.0.0
我试图写一个程序使用套接字,我需要得到自己的本地IP地址 当我在套接字中使用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
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(在那里找到可用端口)