2013-08-29 29 views
1

我想弄清楚如何實現一個爲服務器的UDP數據包不斷「準備」或「偵聽」的客戶端。連續監聽來自服務器的UDP數據包

難道我基本上需要不斷保持socket.receive(packet)直到我收到一個,然後一旦我這樣做,再次打開它?

我應該設置一個重要的socket.setSoTimeout()時間,以使其循環最少次數?

我需要做的:

能夠從服務器請求特定的數據包,然後,在無限的時間量後接收任何數量的數據包

+0

你看過使用Java NIO嗎? – Nick

+0

chrylis似乎建議Java NIO,但我認爲我不能處理複雜的 – benzabill

+0

是你成功實現這一點。我在android中實現了udp監聽器,並在長時間的運行後停止監聽數據包。 http://stackoverflow.com/questions/39271860/udp-broadcast-listener-stops-listening-after-long-time?noredirect=1#comment65880436_39271860 –

回答

1

的依賴有多高,體積你的流量是,你可能會看看NIO,雖然這是一個非常複雜的理解和使用選項。

如果你只是一個基本的應用程序,然後啓動一個線程,只是在receive(packet)阻止。每當它返回時(一個數據包已到達),將數據包分派給某種處理程序。如果流量較低,則可能是某個其他線程正在監聽的BlockingQueue;如果您的流量很高,則可以將作業發送到ExecutorService並行處理。

+0

這是一個非常低的交通應用程序。我是一名初學Android程序員,所以我認爲接收(包)是我想要的。當我收到一個數據包時,我應該把它洗到我需要的地方並保持「聆聽」狀態?我實際上在做的是使用綁定服務(我甚至不確定需要)來設置發送和接收的線程。然後我通過該服務返回信息... – benzabill

+0

不要使用「一個線程」進行發送和接收。有一個專用線程只阻塞該方法,當它們進入時接收數據包,並將它們分派給另一個線程上的處理程序。 – chrylis

+0

當我說「一個線程」,我的意思是我有一個線程發送,然後一個接收不同的線程。使用處理程序發回數據包是一個好主意!你能解釋一下我怎麼一直在聽信息包嗎?它是與一個(無限)的socket.receive(包)循環? – benzabill