js的websocket api很简单
conn.send(msg);
如果这个msg是个很长的文本呢?
服务器读取时应该是有缓冲区的吧,后台会出问题吧。
下面的库给的demo长文本就出了问题(chat的例子)
对于长文本(或者大数据)如何分割(协议内置就做了吗?)
js的websocket api很简单
conn.send(msg);
如果这个msg是个很长的文本呢?
服务器读取时应该是有缓冲区的吧,后台会出问题吧。
下面的库给的demo长文本就出了问题(chat的例子)
对于长文本(或者大数据)如何分割(协议内置就做了吗?)
谢邀,WebSocket我是纯停留在了解理论阶段,没实际操作过。
这里有一篇说明长度限制问题的,大概就是从 Get 改成 Post 就好
http://bbs.csdn.net/topics/39...
另外,我觉得可以考虑使用现成的 Websocket 组件,比如 socket.io。一般组件还可以对不支持 WebSocket 的环境提供兼容方案。
没实际处理数据过大的问题,但有个一个做游戏的朋友讨论过数据包过大传输的问题,他们也是采用分包处理的方式,无论post或者websocket,但需要注意的是接收
数据包的一方要防止乱序问题,因为网络传输速度不稳定性,可能先发的a包后发的b包,而接收方有可能先收到b包后收到a包。
如果这个msg是个很长的文本呢?
服务器读取时应该是有缓冲区的吧,后台会出问题吧。
你是自己猜的还是自己试过?
试过就把出问题的 msg
发出来,在别人可以重现问题的基础上讨论会更有效。
web浏览器自己本身在websocket上再做了一次帧格式的封装. 数据部分最大的长度可以为64位整数的长度, 所以可以认为消息包长度没有限制.
服务器如何对待这个大数据包的读取, 就要看服务器方案了, 你完全可以选择流式读取, 先写入硬盘缓存, 然后再以文件形式交给后续的业务处理. 这样只会浪费硬盘, 不会爆内存.
帧格式可以看看这个介绍: Websocket协议解析
补充说明一下, http服务器处理websocket, 只会处理完http的握手和upgrade返回后就不管的了, 后面就是客户端和服务端的直接Socket连接数据收发, 和TCP连接一样没有区别. 只是一般浏览器都自己做了一个帧协议.
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
websocket 协议中帧长度上限为 2^64,可以认为没有限制。因而在实际使用中 websocket 消息长度限制只取决于服务器实现。
如果发送的数据超出了服务端的限制,可以考虑以下几种方案:
1、发送前压缩数据
因为是文本数据,进行压缩可以显著减小体积。
2、分段发送
一般我们都会在 websocket 协议的基础上再添加一层自定义的协议。做一下分包的逻辑即可。
由于 websocket 是基于 tcp 的,所以本身可以保证数据包是顺序的。分包的实现不算太难。小型的或者测试性质的系统可以这样做。
PS: websocket 协议本身有继续帧和结束帧用于分包,但是浏览器并不提供这样的接口。
3、修改服务端配置以增加限制
一般来说,文本是不会遇到长度限制问题的……就例如 QQ 和微信都只是限制了单条消息的长度,而没有通过技术手段来允许用户发送无限制长度的消息。服务端支持 64K 长度完全没有问题,也完全够用了。
4、通过其他协议上传
如果确实需要传输很长的文本(例如小说、文档),则应该使用单独的文件上传服务进行处理(一般是基于 HTTP 的)。然后只在 websocket 中传输文件上传后的地址。成熟的系统一般选择这种方案,也易于扩展(自定义表情、短视频等等)。但是系统相对复杂,开发成本稍高。