Code Bye

在进行websocket开发的时候压缩无法实现

websocket的通信握手没有问题,但是发送数据的时候需要有一个压缩,我试着将代码写成  如下压缩

        /// <summary>
        /// 往关联的客户端发送数据
        /// </summary>
        public void Send(string message, Socket Client)
        {
            DataFrame dr = new DataFrame(message);
            var buffer = dr.GetBytes();
            NetworkStream stream = new NetworkStream(Client);
            buffer = Compress(stream, buffer);
            _workSocket.Send(buffer); 
        }

        /// <summary>
        /// 压缩
        /// </summary>
        /// <param name=”value”></param>
        /// <returns></returns>
        public byte[] Compress(NetworkStream input, byte[] nbyte)
        {
            using (var compressor = new DeflateStream(input, CompressionMode.Compress,true))
            {
                int offset = 0;
                int count = nbyte.Length;
                compressor.Write(nbyte, offset, count);
                compressor.Close();
                return nbyte;
            }
        }

谷歌浏览器 报错WebSocket connection to “ws://192.168.1.179:8050/” failed: A server must not mask any frames that it sends to the client.

你只应该压缩数据部分,不要把协议的部分一起压缩

10分
所以你需要压缩的其实是message,而不是DataFrame 

60分
你可以先把字符串转换成字节数组,然后压缩,然后按Base64编码成字符串,放到DataFrame里,发送
接收到之后,再按Base64转成byte数组,然后解压,然后转回字符串

10分
websocket基本的协议,应该是不支持压缩的。
引用 3 楼 Z65443344 的回复:

你可以先把字符串转换成字节数组,然后压缩,然后按Base64编码成字符串,放到DataFrame里,发送
接收到之后,再按Base64转成byte数组,然后解压,然后转回字符串

我试了一下改成
        /// <summary>
        /// 往关联的客户端发送数据
        /// </summary>
        public void Send(string message, Socket Client)
        {
            byte[] buffer = System.Text.Encoding.Default.GetBytes(message);
            NetworkStream stream = new NetworkStream(Client);
            buffer = Compress(stream, buffer);

            DataFrame dr = new DataFrame(buffer);
            buffer = dr.GetBytes();
            _workSocket.Send(buffer);
        }
会在DataFrame dr = new DataFrame(buffer) 这一步报错:
偏移量和长度超出数组的界限,或者计数大于从索引到源集合结尾处的元素数量。

 websocket 把数据按照byte[]传入google浏览器应该是可以自动转码和识别的,我在客户端javascript中没有些任何转码代码,在不考虑压缩的时候是完全可以的。

引用 4 楼 sp1234 的回复:

websocket基本的协议,应该是不支持压缩的。

我看到 好像有压缩的,但是就是未找到方法成功,如果基本协议不能直接压缩,怎么处理呢?


20分
你只能压缩你自己的数据包部份。其他的不能压
引用 8 楼 wyd1520 的回复:

你只能压缩你自己的数据包部份。其他的不能压

我改成压缩自己传入部分了,我这边用MemoryStream 和 DeflateStream 来压缩将生成的byte[]传到客户端js报错

WebSocket connection to “ws://192.168.1.179:8050/” failed: Could not decode a text frame as UTF-8.

引用 3 楼 Z65443344 的回复:

你可以先把字符串转换成字节数组,然后压缩,然后按Base64编码成字符串,放到DataFrame里,发送
接收到之后,再按Base64转成byte数组,然后解压,然后转回字符串

按照这个思路搞定了,顺便也梳理了一下 websocket 的思路和使用过程。结贴!


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明在进行websocket开发的时候压缩无法实现