2011-07-25 81 views
1

我正在编程一个服务器(Java) - 客户端(Android/Java)应用程序。该服务器是一个W7。所有的沟通都进行得很顺利,直到客户端读取数据时才冻结并停止读取数据,直到我发送数据2次。Java套接字不读取数据

未读取的数据是一个字节数组。我重复一遍,直到这一点,所有的沟通都顺利进行。

下面是我用于发送数据的代码:

Long lLength = new Long(length); 
byte [] bLength = this.longToBytes(lLength.longValue()); 
dos.write(bLength); 
dos.flush(); 

dos.write(bLength); 
dos.flush(); 

dos.write(bLength); 
dos.flush(); 

该代码转换长值转换成8个字节数组。正如我所说的,当第一次写入被执行(并且客户端正在等待数据)时,读取没有完成。直到我执行最后一次写入()时才完成。

而这里的代码来阅读:

byte length[] = {0,0,0,0,0,0,0,0}; 
dis.read(length); 

我使用Wireshark的嗅探流量,我可以看到字节数组发送,并以ACK客户端的答案,但阅读没有完成。

Here我已经上传了我用wireshark完成的捕获。只有协议数据。

在客户端和服务器,插座都设置这样的:

socket = new Socket(sIP, oiPort.intValue()); 
dos = new DataOutputStream(socket.getOutputStream()); 
dis = new DataInputStream(socket.getInputStream()); 

这是推动我疯了...我不知道为什么,在某一时刻,应用程序停止读取数据,当我以同样的方式发送它。

我想,这个问题可能在客户端套接字的输入缓冲器...但我不知道该怎么做或什么尝试...

说,我也考服务器在WXPSP3,它仍然无法正常工作。

非常感谢,

Newlog。

回答

1

我首先要看的是您的longToBytes方法的代码。它真的创建了一个8字节的字节数组?如果它正在生成一个少于8个字节的数组,那么这就解释了这个问题。 (您的客户预计8字节,并将阻止,直到它们全部到达。)

接下来,我会问自己的是我为什么不只是使用writeLongreadLong。它会简化你的代码,并且很可能解决这个问题。

+0

你好,斯蒂芬。我已经检查了你所说的。使用Wireshark,我可以看到8个字节被发送。我不使用writeLong,因为在写入时,客户端没有读取数据。 (起初它是一个writeLong)。 – newlog