2

私はデバイスをネットワーク化する必要があります: 1. サーバー (可変 IP) は、さらなるもののために文字列を受け取る必要があります (例: ソケット 9999)。このサーバーには、ペアリング時にデバイス名を送信する別のソケット (8888 など) もあります。2. サーバーの IP を知らないが、サーバーに文字列を送信したいクライアント (可変 IP) 。

IP C ネットワークでは、最後のオクテット (0..255) を反復処理して、ソケット 8888 が何かを送信しているかどうかを確認できます。しかし、A ネットワークと B ネットワークではチャンスがありません。これに対する他の解決策はありますか?(4 つのオクテットすべてを繰り返すことはできますが、それはエレガントな解決策ではありません)。

ありがとうございました!

4

1 に答える 1

2

それらが同じLANにある場合、それを行う最も適切な方法は次のとおりです。

  • クライアントは、ネットワーク クラス (A、B、C) に一致する特定のポートに UDP ブロードキャストを送信します。
  • サーバーはこのポートでリッスンし、ブロードキャスト パケットを受信して​​、IP をクライアントに接続または送信します。

2 つのネットワーク パケットだけで、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 に答える