2013-05-01 89 views
1

我有一些問題,理解如何處理套接字。我得到該服務器套接字必須在其自己的線程中運行,因爲它必須檢查是否有新的連接。現在,我不確定是否每個由新連接打開的套接字都應該在一個線程中運行。一個偵聽套接字必須在線程中運行嗎?

我想到的是每x次檢查套接字狀態。如果它有東西要讀,然後閱讀。如果沒有,請檢查下一個套接字。我看到一些例子,這個過程是在一個線程中完成的,但我不想要一個套接字來做東西,只是想要讀取它是否有一些數據,然後處理它們。

+0

如果在處理那些東西時又有一些東西進來,會發生什麼? – 2013-05-01 22:47:24

+0

在不同的線程中做閱讀有什麼不同? – 2013-05-01 22:57:10

+0

如果你得到一個監聽套接字必須在另一個線程中運行,爲什麼它是你的問題的標題? – EJP 2013-05-01 23:25:01

回答

2

答案是否定的,你不需要在單獨的線程中監聽。但是,只要意識到在你「聽」的時候,你的整個計劃將在繼續之前等待完成。

所以,除非你對整個程序等待良好,否則我會建議一個單獨的線程。

+0

現在我使用DataInputStream來檢查是否有一些東西要讀取(input.available();),所以程序不應該等待。我對嗎? – 2013-05-01 22:58:20

+0

可用不應該阻止,所以沒有它不應該等待,如果你只是循環和檢查該方法。但它可能會阻塞讀取(取決於您嘗試讀取的字節數)。這也是一個線程循環的瓶頸。在處理數據時,數據可能正在收集到其他緩衝區中。 – greedybuddha 2013-05-01 23:07:04

+0

那有什麼關係?想象一下你有一個遊戲,以及從客戶端收到的服務器進程輸入。但是你不希望每個連接獨立行動,而是檢索輸入然後處理它們(例如,如果使用組件系統方法,請在不同的系統上執行)。我不明白爲什麼現在需要檢查數據。 – 2013-05-01 23:15:48

1

您也可以有一個線程以循環方式與所有套接字通信。它檢查每個套接字是否有新數據,何時它沒有檢查下一個套接字。

另一種選擇是使用NIO(新輸入/輸出)。

NIO背後的想法是,你有一個Selector擁有多個Channels(一個通道可以是網絡套接字或任何其他IO接口)的線程。然後,你可以在循環中調用selector.select()。此方法阻塞,直到一個或多個通道有數據,然後返回一組這些通道。然後您可以處理傳遞渠道的數據。

Here is a tutorial

1

使用available()的round-robin問題很多。

  1. 它假定可用()實際上工作,這是不能保證。
  2. 它假定所有的客戶都需要相同的服務量。
  3. N-1個客戶端在等待一個客戶端的服務。
  4. 無響應客戶端不僅可以阻止您的應用程序,而且可以阻止所有其他客戶端。

我確定還有更多。

不要這樣做。使用線程或NIO。

相關問題