2

マルチキャストから文字列を受信する際に問題が発生しています。JavaでUDPマルチキャストを使用するのは初めてです。

LAN 経由でマルチクライアント アプリケーションを作成しています。だから私はローカルIPアドレスを使用しています。データやリクエストなどを送信できるように、クライアントがサーバーの IP アドレスを見つける必要があります。

私は、サーバーが自身の IP を文字列として 5 秒ごとにマルチキャストを送信できるようにしました。クライアントはそれを受け取ることができるはずです。問題は、彼らが何も受け取らないことです。2 台のデバイスでテストしているので、localhost を使用する必要はありません。

これが私のコードの一部です: サーバー側:

public class MulticastIpSender extends Thread{

private String serverIp;
private int port;
private String multicastAddress;
private long WAITING_TIME = 5000;  // 5 seconden

private DatagramSocket socket;

public MulticastIpSender(String serverIp, int port, String multicastAddress) throws SocketException {
    super();
    this.serverIp = serverIp;
    this.port = port;
    this.multicastAddress = multicastAddress;
    socket = new DatagramSocket(port);
}

public void run() {
    while(true){
        try {
            byte[] buf = new byte[256];
            buf = serverIp.getBytes();
            InetAddress group = InetAddress.getByName(multicastAddress);
            DatagramPacket packet = new DatagramPacket(buf, buf.length, group, port);
            socket.send(packet);
            System.out.println("sent IP("+serverIp+") to group("+group+") on port "+port);
            sleep(WAITING_TIME);

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

}

このメソッドをメインクラスに入れました:

private void sendIpAddressToListeners() {
    try {
        multicastIpSender = new MulticastIpSender(serverIp,PORT,"230.0.0.1");
        multicastIpSender.run();
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

次のようにserverIpを取得します。

    String hostName = InetAddress.getLocalHost().getHostName();
        InetAddress addrs[] = InetAddress.getAllByName(hostName);
if (!addr.isLoopbackAddress() && addr.isSiteLocalAddress()) {
        myIp = addr.getHostAddress();
        }
        }
        System.out.println ("\nIP = " + myIp);
        return myIp;

このデバイスでは、192.168.1.2 が返されます

クライアント側:

multicastSocket = new MulticastSocket(PORT);
        InetAddress address = InetAddress.getByName(MULTICAST_ADDRESS);
        multicastSocket.joinGroup(address);

        DatagramPacket serverIpPacket;
        byte[] buf = new byte[256];
        serverIpPacket = new DatagramPacket(buf, buf.length);
        while(receivedIp ==null){
            multicastSocket.receive(serverIpPacket);
            receivedIp = new String(serverIpPacket.getData(), 0, serverIpPacket.getLength());
            System.out.println("received server ip: " + receivedIp);
        }

!! PORT = サーバーとクライアントの両方で 4445

誰かがこれを手伝ってくれるか、これを行うためのより良い方法を説明してくれることを願っています.

4

1 に答える 1

3

ブロードキャスト アドレスで通常の DatagramPacket を送信すると、パケットはローカル ネットワーク内のすべてのホストで受信されます (同じネットワーク構成で、重要な部分はマスクです)。

計算機を使用してブロードキャスト アドレスを確認します。これはうまく機能します: http://www.subnet-calculator.com/

于 2012-10-18T14:55:47.220 に答える