Java套接字无法读取数据

时间:2011-07-25 01:37:51

标签: java sockets

我正在编写服务器(java) - 客户端(Android / Java)应用程序。服务器是W7。所有通信都顺利进行,直到客户端中的一个读取冻结并停止读取数据,直到我再发送2次为止。

未读取的数据是字节数组。我再说一遍,所有的沟通都顺利进行到现在为止。

以下是我用来发送数据的代码:

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();

此代码将long值转换为8字节数组。正如我所说,当执行第一次写入(并且客户端正在等待数据)时,不会执行读取操作。直到我执行最后一次write()时才会这样做。

以下是阅读它的代码:

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 个答案:

答案 0 :(得分:1)

我要看的第一件事就是longToBytes方法的代码。它真的创建了一个8字节的字节数组吗?如果它生成的数组少于8个字节,则说明问题所在。 (您的客户端需要8个字节,并且会阻塞,直到它们全部到达。)

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