[英]Sending and receiving an acknowledgement using Datagram UDP
我是套接字編程和Java UDP簡單客戶端服務器應用程序編程的新手。 我正在寫一個時間/日期服務器客戶端。 客戶端可以要求服務器提供時間和日期,並等待響應。 另外,服務器每分鍾都會用當前時間更新所有客戶端。 客戶需要
能夠啟動與服務器的聯系並等待消息返回
偵聽來自服務器的定期更新
如何使用單個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.