2011-05-16 37 views
-2

我們在Windows上的多線程JAVA應用程序中創建了一個套接字,它必須以順序形式讀取數據。但是,我們面臨的問題從InputStream讀取數據多線程JAVA應用程序中的套接字讀取問題

例如,數據順序是

1-100 (1,2,3,4,...100) 
101-200 
201-200 
and so on.. 

我們能夠從1-100的正確順序的方式閱讀,但無法讀取下一組的數據,即101-200。但可以正確讀取更多的數據集。

數據正常到達我們的末端(在etheral日誌中看到),但流無法讀取它。

這裏是代碼片段

socket.getInputStream.read(buffer); 

插座是Socket類型的。

背後的可能原因是什麼?請分享您的觀點。

+5

我懷疑你將需要發佈多一點的代碼... – forsvarir 2011-05-16 13:51:54

+1

多線程 - 這是否意味着,多一個線程坐在插座上? – 2011-05-16 13:57:43

+1

爲什麼人們會利用Java,我想知道..?無論如何,我們需要更多的代碼。 – 2011-05-16 14:27:54

回答

0

這裏是代碼片段

> socket.getInputStream.read(buffer); 

不,它不是。該代碼段不能編譯。而正確的片段顯而易見。

錯過數據的唯一方法是(i)如果另一個線程同時讀取套接字,或者(ii)您一次使用BufferedInputStream或BufferedReader,而另一次使用BufferedInputStream或BufferedReader。

0

您提到這是一個多線程應用程序,所以如果沒有看到您的代碼,我的懷疑可能在於另一個線程可能操縱您的Socket或InputStream。線程問題難以預測和調試。

+2

我認爲很可能多個線程試圖同時讀取輸入流的「不同」部分。 – 2011-05-16 13:55:48

+0

@哈利,是的,我應該已經更清楚了,通過讀取InputStream中的字節,您可以更改流的讀取位置,因此,讀取操作可以操作InputStream,而偷看操作不會。 – 2011-05-16 14:07:01

+0

InputStream上沒有「peek操作」。我沒有看到這個反應的重點。讀操作消耗輸入,所以它消失了。就這麼簡單。 – EJP 2011-05-17 01:52:35

0

感謝您的意見。問題是多線程同步,我處理相同,它工作正常。