簡體   English   中英

使用數據報UDP發送和接收確認

[英]Sending and receiving an acknowledgement using Datagram UDP

我是套接字編程和Java UDP簡單客戶端服務器應用程序編程的新手。 我正在寫一個時間/日期服務器客戶端。 客戶端可以要求服務器提供時間和日期,並等待響應。 另外,服務器每分鍾都會用當前時間更新所有客戶端。 客戶需要

  1. 能夠啟動與服務器的聯系並等待消息返回

  2. 偵聽來自服務器的定期更新

如何使用單個DatagramSocket做到這一點?

我當時正在考慮創建兩個線程:一個監聽線程,一個編寫線程。 問題是,在客戶端啟動與服務器的聯系的情況下,它需要等待以接收來自服務器的確認。 因此,寫入線程有時還需要偵聽來自服務器的數據包。 但是在這種情況下,我有兩個線程正在偵聽,而錯誤的線程將得到確認。

有沒有一種方法可以指定哪個線程獲取輸入? 還是有其他解決方法?

我一直在尋找這個答案,但找不到它。 我找到的最接近的是Java套接字:您可以從一個線程發送而在另一個線程接收嗎?

如果只有一個寫線程,那么它可以發送請求並進入等待循環。 然后,偵聽器線程將獲得響應,將其添加到共享變量(可能是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或其他共享集合,以便響應者可以匹配特定請求,添加響應並通知適當的等待線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM