当前位置: 首页 > 知识库问答 >
问题:

服务器压缩有效负载时出现websocket协议错误

桂志新
2023-03-14
    public void sendMessageDeflated(String rxMessage, OutputStream streamOut) {

    System.out.println("Message back to client is: " + rxMessage);

    // And then compress the response and send it out.
    Deflater compressor = new Deflater(Deflater.DEFLATED);
    try {
        int headerLength = 2;
        byte unzippedMsg[] = rxMessage.getBytes("UTF-8");
        compressor.setInput(unzippedMsg);
        compressor.finish();
        byte zippedMsg[] = new byte[2048];  // Nasty constant but will have to do for now.
        int toCompressLength = unzippedMsg.length;
        int compLength = compressor.deflate(zippedMsg, headerLength, zippedMsg.length - headerLength);
        compressor.end();

        zippedMsg[0] = (byte)0xC1; // FIN bit, compression plus opcode for TEXT MESSAGE
        zippedMsg[1] = (byte)((byte)0x00 | (byte)compLength); // No mask on return data.

        streamOut.write(zippedMsg, 0, compLength + headerLength);

    } catch ( IOException ioEx ) {
        // TBD
        System.out.println("IOException: " + ioEx.toString());
    } catch ( Exception ex ) {
        // TBD
        System.out.println("IOException: " + ex.toString());
    }
}

Gzip

    public void sendMessageGZipped(String rxMessage, OutputStream streamOut) {
    // Do something with the message here...

    System.out.println("Message back to client is: " + rxMessage);

    // And then compress the response and send it out.
    try {
        int headerLength = 2;
        byte unzippedMsg[] = rxMessage.getBytes("UTF-8");
        int toCompressLength = unzippedMsg.length;

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        GZIPOutputStream gzipOut = new GZIPOutputStream(baos);
        gzipOut.write(unzippedMsg, 0, toCompressLength);
        gzipOut.close();
        byte[] payload = baos.toByteArray();

        byte header[] = new byte[32];
        header[0] = (byte)0xC1; // FIN bit plus opcode for TEXT MESSAGE
        header[1] = (byte)((byte)0x00 | (byte)payload.length); // No mask on return data.

        streamOut.write(header, 0, 2);
        streamOut.write(payload);

    } catch ( IOException ioEx ) {
        // TBD
        System.out.println("IOException: " + ioEx.toString());
    } catch ( Exception ex ) {
        // TBD
        System.out.println("IOException: " + ex.toString());
    }
}

我尝试切换到二进制操作码,认为可能压缩文本=binary,但这不起作用。我真的看不出我做错了什么或者错过了什么。此实现不包括跨越消息的滑动压缩窗口。我想响应头说明了这一点。帮助感激地接受了。

共有1个答案

丌官瀚
2023-03-14

我最终通过构建客户端websocket代码解决了这个问题,并看到当它试图膨胀消息时抛出的异常:“无效存储块长度”。这让我写到了这篇文章:Java解压缩字节数组,它讨论了Deflate是否能够使用zlib包装器进行压缩。因此将processMessage2中的一行代码从上面的示例代码更改为...

        Deflater compressor = new Deflater(Deflater.DEFLATED, true);

…它将“nowrap”设置为true。

Chrome浏览器客户端在其报头中声称支持gzip。如果我把它弄好了,我会回到这里,把答案也贴出来。

 类似资料:
  • 我正在开发一个网站,可以连接到一个mqtt代理,并获得有效负载消息。 我使用的库是(https://eclipse.org/paho/clients/js/)。 我的问题是以下几点。当我试图获得一个标准压缩消息(gzipped)时,库抛出一个异常“错误:AMQJS0009E Malformed UTF Data:F53-52”。 如何处理压缩消息? 下面是我的代码:

  • [2019-01-31T13:55:17.138-0500][Payara 4.1][INFO][][TID:_Threadid=37_ThreadName=HTTP-Thread-Pool::HTTP-Listener-2(5)][TimeMillis:1548960917138][LevelValue:800][[HTTP-Thread-Pool::HTTP-Listener-2(5),致命:

  • 本文向大家介绍android利用websocket协议与服务器通信,包括了android利用websocket协议与服务器通信的使用技巧和注意事项,需要的朋友参考一下 最近做一个项目,需求中需要服务器主动推送消息到客户端。这样的话一般的http连接就不能使用了。博主问了个朋友,向我推荐websocket协议,特此测试了一下,发现效果很好。 android本身没有websocket的库,需要自己下载

  • 本服务条款(以下简称“本协议”)由北京百度网讯科技有限公司(以下简称“百度”)与您(以下简称“您”或“用户”)订立,用于规范您对百度统计(以下简称“本服务”)的使用。只要您点击 “确定”按钮、完成注册程序或开通、使用本服务,即代表您已理解并同意本协议,特别是以黑体字标示出的关于百度统计及您重大权益的条款均以知晓、理解并接受,同意将其作为确定双方权利义务的依据。如果您不同意本协议,请您立即停止使用本

  • 京东小程序开放平台开发者服务协议 【请认真阅读并理解以下内容,其中以加粗方式显著标识的文字,请着重阅读、慎重考虑】 前言 1、本协议由拟在京东小程序开放平台(以下或简称“京东小程序平台”或“小程序平台”)开发京东小程序(以下或简称“小程序”)的京东小程序开发者(以下简称“开发者”,“乙方”或“您”)与京东小程序开放平台运营方(以下或简称“京东”或“甲方”)共同缔结,具有合同效力。 2、本协议由协议

  • 1.1. Rokid 开发者社区服务协议 1.1.1. 一、定义 1.2. 二、协议构成 1.3. 三、特别提示 1.3.1. 四、甲方服务内容 1.3.2. 五、开发者承诺和服务使用规范 1.3.3. 六、数据及隐私 1.3.4. 七、服务费用及开发者收费 1.3.5. 八、违约责任 1.3.6. 九、协议的解除和转让 1.3.7. 十、服务终止后的处理 1.3.8. 十一、责任限制和免责 1.