我正在编写服务器(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。
答案 0 :(得分:1)
我要看的第一件事就是longToBytes
方法的代码。它真的创建了一个8字节的字节数组吗?如果它生成的数组少于8个字节,则说明问题所在。 (您的客户端需要8个字节,并且会阻塞,直到它们全部到达。)
接下来我会问自己,为什么我不只是使用writeLong
和readLong
。它会简化您的代码,并且很可能解决问题。