websocket长文本问题?

js的websocket api很简单
conn.send(msg);
如果这个msg是个很长的文本呢?
服务器读取时应该是有缓冲区的吧,后台会出问题吧。
下面的库给的demo长文本就出了问题(chat的例子)

gorilla/websocket

对于长文本(或者大数据)如何分割(协议内置就做了吗?)

阅读 6.8k
评论
    6 个回答

    websocket 协议中帧长度上限为 2^64,可以认为没有限制。因而在实际使用中 websocket 消息长度限制只取决于服务器实现。

    如果发送的数据超出了服务端的限制,可以考虑以下几种方案:

    1、发送前压缩数据
    因为是文本数据,进行压缩可以显著减小体积。

    2、分段发送
    一般我们都会在 websocket 协议的基础上再添加一层自定义的协议。做一下分包的逻辑即可。
    由于 websocket 是基于 tcp 的,所以本身可以保证数据包是顺序的。分包的实现不算太难。小型的或者测试性质的系统可以这样做。
    PS: websocket 协议本身有继续帧和结束帧用于分包,但是浏览器并不提供这样的接口。

    3、修改服务端配置以增加限制
    一般来说,文本是不会遇到长度限制问题的……就例如 QQ 和微信都只是限制了单条消息的长度,而没有通过技术手段来允许用户发送无限制长度的消息。服务端支持 64K 长度完全没有问题,也完全够用了。

    4、通过其他协议上传
    如果确实需要传输很长的文本(例如小说、文档),则应该使用单独的文件上传服务进行处理(一般是基于 HTTP 的)。然后只在 websocket 中传输文件上传后的地址。成熟的系统一般选择这种方案,也易于扩展(自定义表情、短视频等等)。但是系统相对复杂,开发成本稍高。

      一种思路是在客服端将文件分片,webuploader就是采取的大文件分片上传的思路

        • 41.7k

        谢邀,WebSocket我是纯停留在了解理论阶段,没实际操作过。

        这里有一篇说明长度限制问题的,大概就是从 Get 改成 Post 就好
        http://bbs.csdn.net/topics/39...

        另外,我觉得可以考虑使用现成的 Websocket 组件,比如 socket.io。一般组件还可以对不支持 WebSocket 的环境提供兼容方案。

          没实际处理数据过大的问题,但有个一个做游戏的朋友讨论过数据包过大传输的问题,他们也是采用分包处理的方式,无论post或者websocket,但需要注意的是接收数据包的一方要防止乱序问题,因为网络传输速度不稳定性,可能先发的a包后发的b包,而接收方有可能先收到b包后收到a包。

            • 4.9k

            如果这个msg是个很长的文本呢?
            服务器读取时应该是有缓冲区的吧,后台会出问题吧。


            你是自己猜的还是自己试过?
            试过就把出问题的 msg 发出来,在别人可以重现问题的基础上讨论会更有效。

              • 430

              web浏览器自己本身在websocket上再做了一次帧格式的封装. 数据部分最大的长度可以为64位整数的长度, 所以可以认为消息包长度没有限制.
              服务器如何对待这个大数据包的读取, 就要看服务器方案了, 你完全可以选择流式读取, 先写入硬盘缓存, 然后再以文件形式交给后续的业务处理. 这样只会浪费硬盘, 不会爆内存.

              帧格式可以看看这个介绍: Websocket协议解析

              补充说明一下, http服务器处理websocket, 只会处理完http的握手和upgrade返回后就不管的了, 后面就是客户端和服务端的直接Socket连接数据收发, 和TCP连接一样没有区别. 只是一般浏览器都自己做了一个帧协议.

                撰写回答

                登录后参与交流、获取后续更新提醒

                相似问题
                推荐文章