通过Web套接字发送压缩数据(到Flash VNC应用程序)

时间:2014-03-25 16:40:27

标签: websocket jetty flashlight

TL; DR: 发送" Deflate"通过Web套接字将压缩数据压缩到客户端会导致难以跟踪的问题。发送" Deflate"可以通过Web套接字压缩数据吗?

我有一个使用已更新为使用网络套接字的Flashlight VNC的应用程序。为了使其更高效,我试图在数据到达Flash应用程序之前压缩数据。握手后(压缩开始时)VNC客户端立即轰炸。

握手:

'Upgrade: WebSocket\r\n' +
'Connection: Upgrade\r\n' +
'Host: ' + hostport + '\r\n' +
'Origin: ' + url.slice(0, url.indexOf("/", 10)+1) + '\r\n' +
'Sec-WebSocket-Protocol: ' + 'base64' + '\r\n' +
'Sec-WebSocket-Key1: ' + key1 + '\r\n' +
'Sec-WebSocket-Key2: ' + key2 + '\r\n\r\n';

压缩代码(Scala)

def deflate3(str:String):String = {
    val data = str.getBytes
    val deflater = new Deflater
    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
    outputStream.toString
  }

Web套接字发送(嵌入式Jetty 8 / Scala):

def onMessage(message:String) {
      try {
        val compressed = deflate(message)
        serverSocket.connection.sendMessage(compressed)
      } catch {
        case e : Exception => {
          println(e.getCause)
        }
      }
    }

1 个答案:

答案 0 :(得分:2)

有两个选项:

  1. 发送二进制 WebSocket消息(WebSocket文本消息必须包含UTF8编码的有效负载)
  2. 部署实现permessage-deflate WebSocket extension的WebSocket服务器。这将透明地压缩支持permessage-deflate(目前只有Chrome)的浏览器的WebSocket有效负载(文本和二进制)