1

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

  1. 能够发起与服务器的联系并等待消息返回

  2. 监听来自服务器的定期更新

如何使用单个 DatagramSocket 做到这一点?

我正在考虑创建两个线程:一个听,一个写。问题是在客户端发起与服务器的联系的情况下,它需要等待接收来自服务器的确认。因此,写入线程有时也需要监听来自服务器的数据包。但在这种情况下,我有两个线程在监听,错误的线程会得到确认。

有没有办法指定哪个线程获取输入?或者有没有其他方法可以解决这个问题?

我一直在寻找这个答案,但找不到。我发现的最接近的是Java 套接字:您可以从一个线程发送并在另一个线程上接收吗?

4

1 回答 1

0

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

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

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

于 2012-10-23T22:40:56.470 回答