【问题标题】:How to have UDP Server and Client simultaneously listening for incoming and outgoing packets如何让 UDP 服务器和客户端同时监听传入和传出数据包
【发布时间】:2020-07-29 15:16:26
【问题描述】:

我正在尝试在 Java 中实现一个简单的 UDP 连接,我希望客户端和服务器都在监听传入的消息并准备好同时发送消息。

目前,该程序使得服务器开始侦听传入的数据包,因此客户端发送第一条消息。

如果可能的话,我真的很想知道一种简单的方法来实现它。

这是客户端的代码:

class EchoClient 
{
    public static void main( String args[] ) throws Exception 
    {
        System.out.println("\nWelcome to UDP Client");
        System.out.println("---------------------------------------------------");
        
        Scanner sc = new Scanner (System.in);
        
        DatagramSocket socket = new DatagramSocket();
        socket.setSoTimeout(120000);

        while (true)
        {
            //Send
            System.out.print("\nEnter message: ");
            String msg = sc.nextLine();         
            byte[] buffer = msg.getBytes();
            DatagramPacket packetS = new DatagramPacket(buffer,buffer.length,InetAddress.getByName(args[0]),1500);
            socket.send( packetS );
            
            //Receive
            DatagramPacket packetR = new DatagramPacket(new byte[512],512);
            socket.receive( packetR );
            System.out.println( "Alice at: "+new Date()+" "+packetR.getAddress()+":"+packetR.getPort()+"\nSays: "+new String(packetR.getData(),0,packetR.getLength()) );
        }
    }
}

以及服务器的代码:

class EchoServer 
{
    public static void main( String args[] ) throws Exception 
    {
        System.out.println("\nWelcome to UDP Server");
        System.out.println("---------------------------------------------------");

        Scanner sc = new Scanner (System.in);
        
        DatagramSocket socket = new DatagramSocket(1500);
    
        //Message loop
        while ( true ) 
        {   
            //Receiving
            DatagramPacket packetR = new DatagramPacket(new byte[512],512);
            socket.receive( packetR );
            System.out.println("Bob at: "+new Date()+" "+packetR.getAddress()+":"+packetR.getPort()+"\nSays: "+new String(packetR.getData(),0,packetR.getLength()) );
    
            //Send
            System.out.print("\nEnter message: ");
            String msg = sc.nextLine();
            byte[] buffer = msg.getBytes();
            DatagramPacket packetS = new DatagramPacket(buffer,buffer.length,packetU.getAddress(),packetU.getPort());
            socket.send( packetS );
        }
    }
}

【问题讨论】:

  • Re,“准备发送消息......”听起来,......奇怪。您是在谈论 两个 线程,其中一个等待接收消息,而另一个执行各种操作,例如发送消息?还是您认为您需要 三个 线程,其中一个等待输入,一个执行其他操作,第三个等待其他两个中的任何一个 告诉它 发送留言?

标签: java multithreading udp


【解决方案1】:

您好,一个简单的方法是在主线程中启动多个线程。

class EchoServerClient 
{
    public static void main( String args[] ) throws Exception 
    {
        new Thread(() -> {
            EchoServer.main(args) //You can also rename main by another name
        }).start();
        new Thread(() -> {
            EchoClient.main(args) //You can also rename main by another name
        }).start();
    }
}


【讨论】:

  • 所以。我将不得不创建另一个调用服务器和客户端的主要的类?如果是这种情况,我的服务器和客户端位于不同的目录中。知道如何从第三类访问它们吗?
  • 目录或项目?你能把它们放在同一个项目中吗?
  • 我做的很简单。我将服务器和客户端 .java 文件放在不同的文件夹中,并在两个单独的 cmd 终端上编译和运行它们。坦率地说,对 Java 不是很熟悉。
  • OK,两个解决方案,你把这两个类放到EchoServerClient类中。或者您将第三个类添加到不同的文件中并导入它们。在编译过程中,您将不得不同时编译 3 个类
猜你喜欢
  • 2016-06-25
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2016-02-08
相关资源
最近更新 更多