最近在写一个项目,需要和一个server进行tcp连接,用json的方式进行交互。本来以为可以方便地用net.socket来解决问题,但是使用中发现在data事件的回调函数中data未必只含有一个json对象,从而不能直接用JSON.stringgify来进行解析。想知道有什么方便的方法来对tcp中这种类似于流的数据进行处理吗?
@yjhjstz 主要问题是需要实时处理这部分数据……所以我的预期是把client socket和一个缓冲区绑定,另一边异步读取缓冲区中的数据,如果可以读到一个完整的json对象就对其进行处理并触发回调函数继续读取,否则就等待socket中继续传来的数据,不知道nodejs里是否能以类似的做法实现?
这里有个 TCP socket 传文件的例子… https://github.com/magicdawn/node-net-playground/tree/master/fs-stream-socket
- 如果你的 json 很小(< highWaterMark = 64KB) 应该, on(‘data’) 应该可以一次接收到
- 如果超过了, 可以 pipe 到一个 JSON stream 里面去, 到达了指定长度再 unpipe 出来
@leapon 这个方法确实可以……但是就是得手动把data里剩余部分再保存下来供下一次继续用……基本上相当于自己实现了个stream出来了……但我查了一下官方文档net.socket似乎本身就是基于流的实现,那我想应该有一些方法可以直接从里面不停地取吧,再加上nodejs不是本来就含有大量异步编程吗……我以为从一个流里异步读取数据应该是已经有实现了才对?就比如从socket a里异步读取到某个分隔符为止,存到buffer b里,完成以后触发某个回调函数c,我觉得这种模式难道不才是js这门语言里io的惯用模式么……居然没有这种实现?
手动解析并不复杂。。。。。统计有效大括号的数量即可,做一个简单的状态机 默认状态 字符串状态 字符串转义状态 默认状态遇到{将标志加1遇到}将标志减一,遇到"进入字符串状态, 字符串状态遇到\进入字符串转义状态遇到"进入模式状态 字符串转义状态遇到可转义字符或者字符序列则一直移动到标识符末尾然后进入字符串状态 以前用c++做过类似东西,太喜欢状态机了 就酱
npm里一定有相关库,只不过没发现而已
来自酷炫的 CNodeMD