【问题标题】:java Peer to Peer using UDP socketjava点对点使用UDP套接字
【发布时间】:2017-02-23 23:05:18
【问题描述】:

我有一个用 java 编写的简单点对点程序。我有以下代码。

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。我的代码有什么问题?

【问题讨论】:

    标签: java multithreading sockets concurrency udp


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多