繁体   English   中英

如何在JAVA套接字编程中使用UDP来实现两个端口之间的简单消息通信?

[英]How can I use UDP in JAVA Socket Programming to implement simple message communication between two ports?

我正在学习套接字编程,我想设计一个简单的程序,该程序能够在2个端口之间发送和接收消息。 我使用相同的IP地址127.0.0.1(应为localhost),但设置了2个不同的端口,分别代表两个彼此通讯的人。 我打开了两个终端来运行Class Demo2和Class Demo2B,以便在两个班级之间发送和接收消息。 但是,我看不到收到任何消息。 我可以知道我的代码哪里出问题了吗?

这是Demo2

public class Demo2 {
public static void main(String[] args) throws SocketException {
    DatagramSocket sendSocket = new DatagramSocket();
    DatagramSocket receiveSocket = new DatagramSocket(7705);  //Set the Demo2 will use port 7705 to receive data
    new Thread(new send(sendSocket)).start();
    new Thread(new send(receiveSocket)).start();
}

static class send implements Runnable {
    private DatagramSocket datagramSocket;
    private send(DatagramSocket datagramSocket) {
        this.datagramSocket = datagramSocket;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        try {
            while ((line=bufferedReader.readLine())!=null) {
                if(line.equals("88")) {
                    break;
                }
                byte[] buf = line.getBytes();
                DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 8805);  //set the data from Demo2 will be sent to port 8805
                datagramSocket.send(datagramPacket);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException("Fail to send");
        }
    }

}

class receive implements Runnable {
    private DatagramSocket datagramSocket;
    private receive(DatagramSocket datagramSocket) {
        this.datagramSocket = datagramSocket;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true) {
            byte[] buf = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
            try {
                datagramSocket.receive(datagramPacket);
                String ip = datagramPacket.getAddress().getHostAddress();
                String data = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
                System.out.println(ip+":"+data);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                throw new RuntimeException("Fail to send");
            }
        }
     }

  }
}

这是Demo2B

public class Demo2B {
  public static void main(String[] args) throws SocketException {
    DatagramSocket sendSocket = new DatagramSocket();
    DatagramSocket receiveSocket = new DatagramSocket(8805);  //Set the Demo2B will use port 8805 to receive data
    new Thread(new send(sendSocket)).start();
    new Thread(new send(receiveSocket)).start();
}

static class send implements Runnable {
    private DatagramSocket datagramSocket;
    private send(DatagramSocket datagramSocket) {
        this.datagramSocket = datagramSocket;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        try {
            while ((line=bufferedReader.readLine())!=null) {
                if(line.equals("88")) {
                    break;
                }
                byte[] buf = line.getBytes();
                DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 7705);  //set the data from Demo2 will be sent to port 7705
                datagramSocket.send(datagramPacket);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException("Fail to send");
        }
    }

}

class receive implements Runnable {
    private DatagramSocket datagramSocket;
    private receive(DatagramSocket datagramSocket) {
        this.datagramSocket = datagramSocket;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true) {
            byte[] buf = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
            try {
                datagramSocket.receive(datagramPacket);
                String ip = datagramPacket.getAddress().getHostAddress();
                String data = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
                System.out.println(ip+":"+data);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                throw new RuntimeException("Fail to send");
             }
          }
       }

   }
 }

我期望看到的是,一旦我分别运行这两个类,如果将消息从Class Demo2发送到Class Demo2B,Demo2B应该能够捕获并显示数据。 与reverse相同,我可以从Class Demo2B答复给Class Demo2,Class Demo2也将捕获数据并显示它。 如果有人可以帮助我解决这种困惑,我真的很感激。

Demo2Demo2B类中,您仅初始化了发送线程。 您忘记启动接收到的线程。

public class Demo2B {
  public static void main(String[] args) throws SocketException {
    DatagramSocket sendSocket = new DatagramSocket();
    DatagramSocket receiveSocket = new DatagramSocket(8805);  //Set the Demo2B will use port 8805 to receive data
    new Thread(new send(sendSocket)).start();
// This sould be new Thread(new receive(receiveSocket)).start();
    new Thread(new send(receiveSocket)).start();
}

因此,在两个类中更改以下代码将解决问题:

new Thread(new send(sendSocket)).start();
new Thread(new receive(receiveSocket)).start();

由于您只能在这两个类之间的区别是port ,因此您可以简单地保留一个类并提供端口作为要监听的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM