6

http://i.stack.imgur.com/97ERA.png

  1. それぞれのポート番号を持つ 3 つのノード A、B、C があります。
  2. ノード名2つの隣接ノードのポートの3つの引数を取り、それらに文字列をブロードキャストするJavaプログラムを作成しようとしています(したがって、AはBとCにブロードキャストします)。これは 3 秒ごとに行われます。"Hello I'm A"
  3. このプログラムは、3 つの別々のインスタンスで実行されます。
  4. 文字列を受信すると、それを受信したノードを出力します"Received string"(ポート B の例)。

multicastingこれを実装するのは難しいですが、UDPで呼び出されるものについて聞いたことがあります。これまでの私の作業は次のとおりです。何が間違っていますか?

class UDP {
    public static void main(String[] args) throws Exception {
        String nodeName = args[0];
        int neighbourPort1 = Integer.valueOf(args[1]);
        int neighbourPort2 = Integer.valueOf(args[2]);

        while(true) {
            Thread.sleep(3000); //every 3 seconds
            //Continously broadcast and listen to neighbour1
            DatagramSocket socket1 = null;
            try {
                //CREATE SOCKET TO NEIGHBOUR1
                InetAddress host = InetAddress.getByName("localhost");
                socket1 = new DatagramSocket();
                socket1.connect(host, neighbour1);

                //CREATE DATAGRAMS FOR SENDING
                String message = "Hello I'm " + nodeName;
                byte[] sendData = message.getBytes();
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, host, port);
                socket1.send(sendPacket);

                //CREATE DATAGRAMS FOR RECEIVING
                byte[] receiveData = new byte[100]; //is there a way to determine the needed space?
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                socket1.receive(receivePacket);
                System.out.println("Received string");

            } catch(Exception e) { }
            //Do the same for neighbour2, code is basically identical except for variables
            DatagramSocket socket2 = null;
            try {
                //CREATE SOCKET TO NEIGHBOUR2
                InetAddress host = InetAddress.getByName("localhost");
                socket2 = new DatagramSocket();
                socket2.connect(host, neighbour2);

                //FOR SENDING DATAGRAMS
                String message = "Hello I'm " + nodeName;
                byte[] sendData = message.getBytes();
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, host, port);
                socket2.send(sendPacket);

                //FOR RECEIVING DATAGRAMS
                byte[] receiveData = new byte[100]; //is there a way to determine the needed space?
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                socket2.receive(receivePacket);
                System.out.println("Received string");

            } catch(Exception e) { }
        }

    }
}

私は解決に近づいていることを知っています。きちんと放送できますが、常に耳を傾けているところが気になります。

4

2 に答える 2

3

別のスレッドを使用して、独自のポートでデータをリッスンするのが最善だと思います。

  • AはBにデータを送信し、 Bからパケットを取得するまでブロックします。
  • BはCにデータを送信し、 Cからパケットを取得するまでブロックします。
  • CはAにデータを送信し、 Aからパケットを取得するまでブロックします。

すべてのノードは互いに待機しています。パケットを送信して 3 秒待つだけです。もう一方のスレッドはリッスンのみになります。

public class UDP {

    public static void main(String[] args) throws Exception {
        final String nodeName = args[0];
        final int ownPort = Integer.valueOf(args[1]);
        final int neighbourPort1 = Integer.valueOf(args[2]);
        final int neighbourPort2 = Integer.valueOf(args[3]);


        // Don't create a new socket every time
        DatagramSocket neighbour1 = new DatagramSocket();
        DatagramSocket neighbour2 = new DatagramSocket();

        neighbour1.connect(InetAddress.getLocalHost(), neighbourPort1);
        neighbour2.connect(InetAddress.getLocalHost(), neighbourPort2);

        // You have to LISTEN
        new Thread() {
            @Override
            public void run() {
                try {
                    DatagramSocket socket = new DatagramSocket(ownPort);

                    byte[] buffer = new byte[socket.getReceiveBufferSize()];
                    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

                    while (true) {
                        // Blocks until it gets a packet
                        socket.receive(packet);

                        System.out.println("Received string");
                    }

                    // socket.close();
                } catch (final Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();

        while (true) {
            Thread.sleep(3000);

            sendPacket(neighbour1, nodeName);
            sendPacket(neighbour2, nodeName);
        }

        // If you're not using an infinite loop:
        // neighbour1.close();
        // neighbour2.close();
    }

    private static void sendPacket(DatagramSocket to, String from) throws Exception {
        String message = "Hello I'm " + from;
        byte[] data = message.getBytes();

        DatagramPacket packet = new DatagramPacket(data, data.length);
        to.send(packet);
    }

}
于 2012-10-17T14:52:02.757 に答える
1

これは、2 つのスレッド (1 つの書き込みと 1 つの読み取り) を持つサーバーの単純なフレームで、ネットワーク コードを適切な場所に配置します。

package testing;

import java.util.Scanner;

public class ThreadTest {
public class MyListenerThread extends Thread {

@Override
public void run() {
    /*
     * Open Datagram ...
     */
    while (true) {
    /*
     * Read data ...
     */
    Scanner scanner = new Scanner(System.in);
    System.out.println("read: " + scanner.next());
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    }
}

}

public class MySenderThread extends Thread {
@Override
public void run() {
    /*
     * Open Multicast ...
     */
    while (true) {
    /*
     * Send ...
     */
    System.out.println("Send ...");
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    }
}

}

public void start() {
MyListenerThread listener = new MyListenerThread();
MySenderThread sender = new MySenderThread();

listener.start();
sender.start();
}

public static void main(String[] args) {
ThreadTest server = new ThreadTest();
server.start();
}

}
于 2012-10-17T14:48:31.980 に答える