Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用数据报UDP发送和接收确认_Java_Multithreading_Sockets_Networking_Udp - Fatal编程技术网

Java 使用数据报UDP发送和接收确认

Java 使用数据报UDP发送和接收确认,java,multithreading,sockets,networking,udp,Java,Multithreading,Sockets,Networking,Udp,我不熟悉套接字编程和Java UDP简单客户机-服务器应用程序编程。我正在编写一个时间/日期服务器客户端。客户端可以向服务器询问时间和日期,然后等待响应。此外,服务器每分钟都会用当前时间更新所有客户端。客户需要 能够启动与服务器的联系并等待消息返回 侦听来自服务器的定期更新 如何使用单个DatagramSocket实现这一点 我在考虑创建两个线程:一个用于侦听,另一个用于写入。问题是,在客户机发起与服务器联系的情况下,它需要等待从服务器接收确认。因此,写入线程有时还需要侦听来自服务器的数据包。但

我不熟悉套接字编程和Java UDP简单客户机-服务器应用程序编程。我正在编写一个时间/日期服务器客户端。客户端可以向服务器询问时间和日期,然后等待响应。此外,服务器每分钟都会用当前时间更新所有客户端。客户需要

  • 能够启动与服务器的联系并等待消息返回

  • 侦听来自服务器的定期更新

  • 如何使用单个DatagramSocket实现这一点

    我在考虑创建两个线程:一个用于侦听,另一个用于写入。问题是,在客户机发起与服务器联系的情况下,它需要等待从服务器接收确认。因此,写入线程有时还需要侦听来自服务器的数据包。但在本例中,我有两个线程在侦听,错误的线程将得到确认

    有没有办法指定哪个线程获得输入?还是有其他方法来解决这个问题


    我一直在寻找这个答案,但找不到。我发现的最接近的是

    如果只有一个writer线程,那么它可以发送请求并进入等待循环。侦听器线程随后将获取响应,将其添加到共享变量(可能是
    原子引用
    ),然后通知编写器已收到响应

      // both write and listener threads will need to share this
      private final AtomicReference<Response> responseRef =
         new AtomicReference<Response>();
      ...
      // writer-thread
      writeRequest(request);
      synchronize (responseRef) {
         while (responseRef.get() == null) {
            // maybe put a timeout here
            responseRef.wait();
         }
      }
      processResponse(response);
      ...
    
      // listener-thread
      Response response = readResponse();
      synchronize (responseRef) {
         responseRef.set(response);
         responseRef.notify();
      }
    
    //写入线程和侦听器线程都需要共享此
    私人最终原子参考响应REF=
    新原子引用();
    ...
    //写线程
    书面请求(请求);
    同步(responseRef){
    while(responseRef.get()==null){
    //也许在这里暂停一下
    responseRef.wait();
    }
    }
    过程响应(response);
    ...
    //侦听器线程
    Response=readResponse();
    同步(responseRef){
    responseRef.set(响应);
    responseRef.notify();
    }
    

    如果同时发送多个写入程序或多个请求,则会变得更加复杂。您需要在每个请求中发送某种唯一的id,并在响应中返回它。然后响应线程可以将请求与响应匹配起来。您需要一个
    ConcurrentHashMap
    或其他共享集合,以便响应者可以匹配特定请求,添加响应,并通知相应的等待线程。

    如果这是一个客户端/服务器应用程序,TCP将更适合。。。