我建立一個UDP客戶端,可以選擇不同的服務器進行通信。鑑於NIO應用程序涉及使用單個接收線程,我如何將傳入數據報派送到我的應用程序的正確部分?即將輸入分組與輸出分組相關聯。從理論上講,發送(或連接?)到服務器時,應該可以在傳出數據報中獲取源IP /端口,然後通過檢查目標IP /端口來識別傳入數據包作爲其響應。 (因爲:http://www.dcs.bbk.ac.uk/~ptw/teaching/IWT/transport-layer/source-destination.gif)的Java NIO UDP客戶端與多個服務器
大多數UDP客戶端的實例似乎是假設在單一服務器上,以便識別傳入的數據報以傳出數據報的響應是微不足道的,例如:
ByteBuffer textToEcho = ByteBuffer.wrap("blah");
ByteBuffer echoedText = ByteBuffer.allocateDirect(MAX_PACKET_SIZE);
DatagramChannel datagramChannel = DatagramChannel.open(StandardProtocolFamily.INET)
datagramChannel.connect(new InetSocketAddress(REMOTE_IP, REMOTE_PORT));
while(true)
{
int sent = datagramChannel.write(textToEcho);
datagramChannel.read(echoedText);
}
也許我可以使用多個DatagramChannels和迭代調用每個read(),將數據調度到適當位置,以便我的應用程序預期響應?
因此,在這種情況下,我將每個服務器有一個線程在客戶端上?我應該補充說,客戶端實際上是一個代表客戶端將消息中繼到另一個本地服務器的服務器。考慮到會有很多(實際的,非本地的)客戶,如果可能的話,我想避免每個客戶的線程。 – user1478842
或者你的意思是說我可以有專門的讀寫線程發送到多個通道。 我對NIO風格編程的印象是,我們通常使用單個DatagramChannel,但多路複用。我知道如何發送(只需指定目標IP:端口)時復,但我不知道如何與一個DatagramChannel在客戶端上接收復用的時候,這就是我試圖找出答案。 – user1478842
如果你真的只想要一個頻道,那麼是的:一條線是要走的路。一個通道意味着一個端口,因此您必須檢查傳入的數據包源地址以區分服務器。我會添加另一個答案來解釋如何。 –