使用UDP套接字的Java Peer to Peer

时间:2016-10-14 13:31:32

标签: java multithreading sockets concurrency udp

我正在用java编写一个简单的Peer to Peer程序。我有以下代码。

import java.net.*;
import java.io.*;
public class Broadcasts {

private final Runnable receiver;
private final Runnable sender;
private boolean run = true;


  public Broadcasts(UDPSocketHandler parent)  throws UnknownHostException{
    InetAddress aHost = InetAddress.getLocalHost();

    sender = new Runnable() {
        public void run() {
            byte data[] = "Hello".getBytes();
            DatagramSocket socket = null;
            try {
                socket = new DatagramSocket();
            } catch (SocketException ex) {
                ex.printStackTrace();
                parent.quit();
            }

            DatagramPacket packet = new DatagramPacket(
                    data,
                    data.length,
                    aHost,
                    9090);
            while (run) {
                try {

                    System.out.println("what is sent"+new String(packet.getData()));
                    socket.send(packet);
                    Thread.sleep(1000);
                } catch (IOException ex) {
                    ex.printStackTrace();
                    parent.quit();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                    parent.quit();
                }
            }
        }
    };


    receiver = new Runnable() {
        public void run() {
            byte data[] = new byte[0];
            DatagramSocket socket = null;
            try {
                socket = new DatagramSocket(9090);
            } catch (SocketException ex) {
                ex.printStackTrace();
                //parent.quit();
            }
            DatagramPacket packet = new DatagramPacket(data, data.length);
            //System.out.println("this is what has been received"+packet.getData());
            String temp;
           // while (run) {
                try {
                    socket.receive(packet);
                    System.out.println("this is what has been received"+packet.getData());

                    //System.out.println("Message received ..."+ temp);
                } catch (IOException ex) {
                    ex.printStackTrace();
                    parent.quit();
                }

            //}
        }
    };


    new Thread(sender).start();
    new Thread(receiver).start();

}

  public void quit() {
    run = false;
  }
}

然后我有以下课程来处理我的沟通

public class UDPSocketHandler {

  private final Broadcasts broadcasts;
// continue running application?
  private boolean run = true;

  public UDPSocketHandler() throws UnknownHostException
  {
    // start socket server to accept incoming connections
    new Thread().start();


    // late initialize of UDP broadcast and receive, to ensure needed
    // objects are instantiated
    broadcasts = new Broadcasts(this);
}

// global quit method shuts down everything and exits
public void quit() {
    run = false;
    broadcasts.quit();
    System.exit(0);
}

// application entry
  public static void main(String[] args) throws UnknownHostException{
   new UDPSocketHandler();

  }
}

问题是接收器没有收到任何东西。根据我的理解,我们可以运行发件人并接收相同的程序,如question所示。这实际上是我想要做的,但使用UDP而不是TCP。我的代码有什么问题?

1 个答案:

答案 0 :(得分:2)

经过一些努力和工作,我终于设法让我的程序正常运行。我有以下内容:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.*;

public class SocketTest {
  private boolean run = true;


  public static void main(String[] args) throws IOException {

    startServer();
    startSender();
  }

  public static void startSender() throws UnknownHostException{
    InetAddress aHost = InetAddress.getLocalHost();
    (new Thread() {
        @Override
        public void run() {
            byte data[] = "Hello".getBytes();
            DatagramSocket socket = null;
            try {
                socket = new DatagramSocket();
                socket.setBroadcast(true);
            } catch (SocketException ex) {
                ex.printStackTrace();
                //parent.quit();
            }

            DatagramPacket packet = new DatagramPacket(
                    data,
                    data.length,
                    aHost,
                    9090);
            int i=0;
            while (i<10) {
                try {

                    System.out.println("what us mmmm.."+new String(packet.getData()));
                    socket.send(packet);
                    Thread.sleep(50);
                    i++;
                    System.out.println(i);
                } catch (IOException ex) {
                    ex.printStackTrace();
                   // parent.quit();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                   // parent.quit();
                }
            }
        }}).start();
    }


  public static void startServer() {
    (new Thread() {
        @Override
        public void run() {

                //byte data[] = new byte[0];
                DatagramSocket socket = null;
                try {
                    socket = new DatagramSocket(9090);
                    //socket.setBroadcast(true);;

                } catch (SocketException ex) {
                    ex.printStackTrace();
                    //parent.quit();
                }
                DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
                //System.out.println("this is what has been received111"+packet.getData());
                String temp;
                while (true) {
                try {
                    socket.receive(packet);
                    temp=new String(packet.getData());
                    System.out.println("this is what has been received"+temp);


                    //System.out.println("Message received ..."+ temp);
                } catch (IOException ex) {
                    ex.printStackTrace();
                    //parent.quit();
                }

                 }
            }

    }).start();
 }
}

使用此代码,每个节点都可以充当客户端和服务器。我们所要做的就是传递我们发送请求的服务器的正确端口号。在此示例代码中,端口号与将数据包发送给自身的客户端相同。我希望这可以帮助别人