gpt4 book ai didi

android - IP自动发现

转载 作者:行者123 更新时间:2023-11-29 00:35:47 25 4
gpt4 key购买 nike

我必须联网设备: 1. 需要接收字符串的服务器(可变 IP)(例如 Socket 9999)。该服务器还有另一个套接字(例如 8888),它在配对时发送它的设备名称。 2. 客户端(可变 IP)知道服务器的 IP 但想向他发送字符串。

在 IP C 网络上,我可以遍历最后一个八位字节 (0..255) 并检查套接字 8888 是否传输某些内容。但是在 A 和 B 网络上我没有机会。还有其他解决方案吗? (我可以遍历所有四个八位字节,但这不是一个优雅的解决方案)。

谢谢!

最佳答案

如果他们在同一个 LAN 中,最合适的方法是:

  • 客户端向特定端口发送 UDP 广播并匹配网络类别 (A,B,C)
  • 服务器监听这个端口,接收广播数据包并连接或发送他的IP到客户端。

只需两个网络数据包,您就可以知道 IP 地址。

--编辑--

广播:

InetAddress broadcastAddr = SharedFunctions.getNetworkLocalBroadcastAddressdAsInetAddress();

DatagramSocket socket = null;
try {
socket = new DatagramSocket();
socket.setBroadcast(true);
System.arraycopy(BROADCAST_SIGNATURE, 0, buffSend, 0, BROADCAST_SIGNATURE.length);
DatagramPacket packet = new DatagramPacket(buffSend, buffSend.length, broadcastAddr, BROADCAST_PORT);
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
if(socket != null) try {socket.close();} catch (Exception e1) {}
}


public static InetAddress getNetworkLocalBroadcastAddressdAsInetAddress() throws IOException {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
if(VERSION.SDK_INT < 9) {
if(!intf.getInetAddresses().nextElement().isLoopbackAddress()){
byte[] quads = intf.getInetAddresses().nextElement().getAddress();
quads[0] = (byte)255;
return InetAddress.getByAddress(quads);
}
}else{
if(!intf.isLoopback()){
List<InterfaceAddress> intfaddrs = intf.getInterfaceAddresses();
return intfaddrs.get(0).getBroadcast(); //return first IP address
}
}
}
return null;
}

接收广播:

        try {
socketReceiver = new DatagramSocket(BROADCAST_PORT);
socketReceiver.setBroadcast(true);
DatagramPacket packet = new DatagramPacket(buffRecv, buffRecv.length);
while(Thread.currentThread() == cThreadReceiver){
socketReceiver.receive(packet);
//here you receive the packet and can check the sender IP address
}
} catch (Exception e) {
e.printStackTrace();
if(socketReceiver != null) try {socketReceiver.close();} catch (Exception e1) {}
}

您将需要进行一些编辑,但应该在正确的轨道上开始。

关于android - IP自动发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12796135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com