请问如何从nodejs的TCP流中解析JSON对象?
发布于 21 天前 作者 lcdlyxrqy 823 次浏览 来自 问答

最近在写一个项目,需要和一个server进行tcp连接,用json的方式进行交互。本来以为可以方便地用net.socket来解决问题,但是使用中发现在data事件的回调函数中data未必只含有一个json对象,从而不能直接用JSON.stringgify来进行解析。想知道有什么方便的方法来对tcp中这种类似于流的数据进行处理吗?

12 回复

要在 end 事件中处理吧,data 回调负责积累数据。

data 里是数据片段,自己解析还是比较费劲的。不需要实时信息的话,还是在 end 里处理比较好。

@yjhjstz 主要问题是需要实时处理这部分数据……所以我的预期是把client socket和一个缓冲区绑定,另一边异步读取缓冲区中的数据,如果可以读到一个完整的json对象就对其进行处理并触发回调函数继续读取,否则就等待socket中继续传来的数据,不知道nodejs里是否能以类似的做法实现?

@leapon 同上,就是比较想知道有没有一个现成的实现可以从一个流或者说缓冲区里读出一个完整的json然后返回其剩下部分。

你看看 socket.io 是否符合你的要求。

这里有个 TCP socket 传文件的例子… https://github.com/magicdawn/node-net-playground/tree/master/fs-stream-socket


  • 如果你的 json 很小(< highWaterMark = 64KB) 应该, on(‘data’) 应该可以一次接收到
  • 如果超过了, 可以 pipe 到一个 JSON stream 里面去, 到达了指定长度再 unpipe 出来

我试过 40MB 的大文件…可以传的…

@lcdlyxrqy 我做过类似的项目。data 里的用回车符split 一下,对得到的每一完整行判断,可以解析的话就raise event出去。不完整的行推到下一个data再处理。

@leapon 这个方法确实可以……但是就是得手动把data里剩余部分再保存下来供下一次继续用……基本上相当于自己实现了个stream出来了……但我查了一下官方文档net.socket似乎本身就是基于流的实现,那我想应该有一些方法可以直接从里面不停地取吧,再加上nodejs不是本来就含有大量异步编程吗……我以为从一个流里异步读取数据应该是已经有实现了才对?就比如从socket a里异步读取到某个分隔符为止,存到buffer b里,完成以后触发某个回调函数c,我觉得这种模式难道不才是js这门语言里io的惯用模式么……居然没有这种实现?

@lcdlyxrqy 这个解析和数据格式有关。JSON 数据可以没有回车符的。搞好了,你可以发表一个npm package让后人瞻仰 :)

手动解析并不复杂。。。。。统计有效大括号的数量即可,做一个简单的状态机 默认状态 字符串状态 字符串转义状态 默认状态遇到{将标志加1遇到}将标志减一,遇到"进入字符串状态, 字符串状态遇到\进入字符串转义状态遇到"进入模式状态 字符串转义状态遇到可转义字符或者字符序列则一直移动到标识符末尾然后进入字符串状态 以前用c++做过类似东西,太喜欢状态机了 就酱

npm里一定有相关库,只不过没发现而已

来自酷炫的 CNodeMD

回到顶部