2014-11-05 57 views
0

可用對象當ServerClient使用字符串進行通信(使用BufferedReaderPrintWriter類)時,BufferedReader類有一個叫做ready()方法,這意味着有等待客戶端抓住和串處理。這種方法也使服務器與2個線程,這是我想要實現的。檢查從插座中使用的ObjectInputStream

當使用ObjectInputStreamObjectOutputStream類,OIS類不具有「準備就緒()」方法,代替它具有所謂的「可用的()」,它返回可用的字節數被處理方法。問題是,available()方法返回0,每次和OIS缺乏「準備就緒()」方法使服務器是多線程(線程1爲每個連接加上主線程),這不是我想要的。

那麼,有沒有一種方法來檢查Server是否已經「收到」來自ObjectInputStreamSocketObject,而無需創建並保持一個Thread爲每個連接?

+1

如果你不希望一個線程每客戶端比,使用NIO,它使用一個選擇器來查看數據是否可用,或者連接可用。您將'Selector'註冊到套接字。然後,您有1個線程檢查選擇器是否有可用的鍵。我有一個如何建立一個選擇[這裏](http://stackoverflow.com/questions/24616774/non-socket-based-java-server/24617983#24617983) – 2014-11-06 00:10:33

+0

@VinceEmigh這是很好的一個例子。我需要看看一些API,但這肯定有幫助。謝謝。 – 2014-11-06 00:17:08

回答

1

有沒有一種方法來檢查服務器是否通過Socket從ObjectInputStream中「接收」了一個對象,而無需爲每個連接創建並保持一個線程?

沒有,因爲服務器還沒有 '從ObjectInputStreamSocket收到Object'。它沒有做到這一點直到你打電話readObject().原因ObjectInputStream.available()總是返回零的是,它不會預先知道下一個對象有多大,所以不能判斷它是否是所有有或沒有,所以它不不騙你,它只是說你可能無法讀取任何東西,沒有阻止。這沒有解決辦法。 Selector.select()是沒有任何更多的溶液,因爲它也不知道下一個對象有多大,更不用說爲select()所需的非阻塞模式和用於readObject().

需要阻斷模式之間切換的困難使用專用的讀取線程。

+0

或者他可以完全忽略java.io,並且保持非阻塞狀態(如果允許的話;那就是我的評論所暗示的)。而且也不能反對的大小可以通過一個整潔的協議是accessable?(連載,發送有效載荷,將數據發送) – 2014-11-06 00:54:14

+0

@VinceEmigh他不能完全,如果他想系列化java.io'「疏忽'。 – EJP 2014-11-06 01:07:50

+0

是的,我想要序列化。 – 2014-11-06 13:37:57