使用UDP套接字的Java点对点通信

3

我正在使用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();

  }
}

问题在于接收器没有接收到任何东西。据我所了解,我们可以像这个问题中所示,在同一程序中运行发送方和接收方。这正是我想要做的事情,但我想使用UDP而不是TCP。我的代码有什么问题?

1个回答

4

经过一些努力和几个小时的尝试,我终于设法让我的程序运行起来了。现在我有以下内容:

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

使用这段代码,每个节点都可以充当客户端和服务器。我们只需要将正确的服务器端口号传递给我们发送请求的服务器即可。在此示例代码中,端口号与将数据包发送到自己的客户端相同。希望这能帮助其他人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接