我有一些通过Web套接字发送到Flash客户端的数据。在将数据发送到客户端之前,使用Java Deflate类压缩该数据。
我得到了
错误#2058:解压缩数据时出错
当线路上的数据很大并且调用byteArray的deflate方法
时在服务器上清除代码(Scala):
def deflate(str:String):Array[Byte] = {
val data = str.getBytes
val deflater = new Deflater(9, true)
deflater.setInput(data)
val outputStream = new ByteArrayOutputStream(data.length)
deflater.finish
val buffer = new Array[Byte](1024)
while(!deflater.finished) {
val count = deflater.deflate(buffer)
outputStream.write(buffer, 0, count)
}
outputStream.close
val output = outputStream.toByteArray
output
}
发送给客户:
def sendToClient(message:String) {
println("original message length: " + message.length)
val compressed = deflate(message)
//wrap the compressed data in base64 encoded string because of a requirement for this on the client
val toClient = Base64.encodeBase64String(compressed)
clientConnection.sendMessage(toClient)
}
客户端:
//read the data into the ByteArray
while(socket.bytesAvaialble > 4) {
//unwrap base64 encoded stuff
myByteArray[position] = socket.readUnsignedByte();
}
//inflate the data in the ByteArray
myByteArray.inflate();
当数据来自websocket的数据很大时,对膨胀的调用失败,因为并非所有数据都存在。在我调用inflate()
之前,我想弄清楚如何确保所有数据都存在根据this(第9页),我应该寻找一个块头来确定所有压缩内容何时到达。
如何使用ByteArray API查找该标头?
答案 0 :(得分:1)
找到放气流结束的唯一方法是给它充气。通过简单地查看例如某些位或字节模式,结果并不明显。 deflate流中的所有表和代码都需要按顺序解码,直到遇到结束。
我不能说你正在使用的API,但通常zlib的接口允许一次给膨胀对象输入一段deflate流。充气机将告诉您何时到达压缩数据的末尾,并且在放气流之后您将留下未使用的字节。