我使用 Sockets 开发了一个客户端-服务器聊天,效果很好,但是当我尝试使用 Deflate 压缩传输数据时它不起作用:输出为“空”(实际上它不是空的,但我将在下面解释)。
压缩/解压部分是 100% 工作的(我已经测试过了),所以问题肯定出在传输/接收部分的其他地方。
我使用以下方法将消息从客户端发送到服务器:
// streamOut is an instance of DataOutputStream
// message is a String
if (zip) { // zip is a boolean variable: true means that compression is active
streamOut.write(Zip.compress(message)); // Zip.compress(String) returns a byte[] array of the compressed "message"
} else {
// if compression isn't active, the client sends the not compressed message to the server (and this works great)
streamOut.writeUTF(message);
}
streamOut.flush();
我使用这些其他方法从客户端接收到服务器的消息:
// streamIn is an instace of DataInputStream
if (server.zip) { // same as before: true = compression is active
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[512];
int n;
while ((n = streamIn.read(buf)) > 0) {
bos.write(buf, 0, n);
}
byte[] output = bos.toByteArray();
System.out.println("output: " + Zip.decompress(output)); // Zip.decompress(byte[]) returns a String of decompressed byte[] array received
} else {
System.out.println("output: " + streamIn.readUTF()); // this works great
}
稍微调试一下我的程序,我发现 while 循环永远不会结束,所以:
byte[] output = bos.toByteArray();
System.out.println("output: " + Zip.decompress(output));
永远不会被调用。
如果我将这两行代码放在 while 循环中(在bos.write()之后),那么一切正常(它打印从客户端发送的消息)!但我认为这不是解决方案,因为收到的 byte[] 数组的大小可能会有所不同。因此,我认为问题出在接收部分(客户端实际上能够发送数据)。
所以我的问题变成了接收部分的while循环。我试过:
while ((n = streamIn.read(buf)) != -1) {
即使有条件!= 0,但它和以前一样:循环永远不会结束,所以输出部分永远不会被调用。