2012-10-23 109 views
1

我是新的套接字編程和編程Java UDP簡單的客戶端 - 服務器應用程序。我正在寫一個時間/日期服務器客戶端。客戶端可以詢問服務器的時間和日期,並等待響應。此外,服務器每分鐘都會用當前時間更新所有客戶端。客戶端需要使用數據報UDP發送和接收確認

  1. 能夠啓動與服務器的連接並等待消息返回

我怎樣才能做到這一點使用監聽定期更新從服務器一個DatagramSocket?

我想創建兩個線程:一個是監聽,另一個是寫。問題是,在客戶端啓動與服務器的聯繫的情況下,它需要等待從服務器接收確認。所以,編寫線程有時也需要偵聽來自服務器的數據包。但在這種情況下,我有兩個線程正在偵聽,並且錯誤的線程會得到確認。

有沒有辦法指定哪個線程獲取輸入?或者有其他方法可以解決這個問題嗎?

我一直在尋找這個答案,但無法找到它。我發現的最近的是Java sockets: can you send from one thread and receive on another?

+0

如果這是一個客戶端/服務器應用程序,TCP會更適合... – ryan0

回答

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

如果您有多個寫入器或多個請求被同時發送,則會變得更加複雜。您需要爲每個請求發送某種唯一標識並將其返回給響應。然後,響應線程可以將請求與響應進行匹配。您需要一個ConcurrentHashMap或其他共享集合,以便響應者可以匹配特定請求,添加響應並通知適當的等待線程。