2011-05-16 35 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

感谢您的意见。问题是多线程同步,我处理相同,它工作正常。