实现一个连续广播到其邻居的简单UDP网络

时间:2012-10-17 13:42:44

标签: java udp

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

  1. 我有3个节点A,B和C及其各自的端口号。
  2. 我正在尝试编写一个包含 3个参数的java程序: 其节点名称及其 2个相邻节点的端口并向其广播字符串"Hello I'm A"(因此A将广播到B和C)。它将每3秒执行一次。
  3. 此程序将在3个不同的实例中运行。
  4. 收到字符串后,它会打印从"Received string"收到的节点(例如,端口B)。
  5. 我在实现这个方面遇到了困难,但我听说过带有UDP的multicasting。到目前为止,这是我的工作,我做错了什么?

    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) { }
            }
    
        }
    }
    

    我知道我接近解决方案。我能够正常播放,但这是我不断倾听的部分。

2 个答案:

答案 0 :(得分: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);
    }

}

答案 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();
}

}