2

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

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

谢谢!

4

1 回答 1

2

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

  • 客户端向特定端口发送 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) {}
        }

您将需要进行一些编辑,但应该让您走上正确的道路。

于 2012-10-09T09:13:05.567 回答