我必须联网设备: 1. 服务器(可变 IP)需要接收字符串以获取更多内容(例如 Socket 9999)。该服务器还有另一个套接字(例如 8888),它在配对时发送它的设备名称。2.客户端(可变IP)不知道服务器的IP,但想向他发送字符串。
在 IP C 网络上,我可以遍历最后一个八位字节 (0..255) 并检查 Socket 8888 是否传输了一些东西。但在 A 和 B 网络上,我没有机会。有没有其他解决方案?(我可以遍历所有四个八位字节,但这不是一个优雅的解决方案)。
谢谢!
我必须联网设备: 1. 服务器(可变 IP)需要接收字符串以获取更多内容(例如 Socket 9999)。该服务器还有另一个套接字(例如 8888),它在配对时发送它的设备名称。2.客户端(可变IP)不知道服务器的IP,但想向他发送字符串。
在 IP C 网络上,我可以遍历最后一个八位字节 (0..255) 并检查 Socket 8888 是否传输了一些东西。但在 A 和 B 网络上,我没有机会。有没有其他解决方案?(我可以遍历所有四个八位字节,但这不是一个优雅的解决方案)。
谢谢!
如果他们在同一个局域网中,最合适的方法是:
只需两个网络数据包,您就知道 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) {}
}
您将需要进行一些编辑,但应该让您走上正确的道路。