NodeJS开发TCP server请教。
发布于 8 年前 作者 cookcpp 4653 次浏览 来自 问答

大家好,我现在想用NodeJS搭建一个web,但是多了点不一样的东西:

  • 后台server同时要开一个TCP server 接受嵌入式传感器上传的数据,最多估计也就不会超过1万个。

TCP server想实现的功能:

  • 支持很多嵌入式设备的连接,这个可能是TCP的长连接,也可能是TCP短连接。
  • 数据内容为16进制,所以要实现自定义的编码器和解码器。

TCP server开发疑问:

  • TCP server 接受这么多的数据,怎样保证数据的可靠解析?
  • 数据解析的时候web要能正常使用,不会卡死。
  • 我可不可以理解为 用nodejs的net模块编写TCP server的时候,整体是异步的,对于每一个client的连接是同步的?
  • 拆分TCP粘包的时候需要注意什么?

本人刚接触Nodejs,还请各位前辈多指点点:)

6 回复

对应楼主的问题,楼主如果对socket编程熟悉的话,1和4 都不是问题,因为用 nodojs跟你直接用 socket 做几乎是一样的, 无非就是收/发 buffer,buffer 就是原始的tcp字节流,怎样识别解析应该是你自己的事。 第2点. 是最简单的办法就是 tcpserver 和 web 分别启动nodejs,用不同的端口,卡不卡死,就看你机器性能了。 第3点. 准确的说,nodejs的net模块中每一个 read, write 都是异步的。

传感器上传的数据,应该是有协议的吧, 每个协议的数据量应该不会特别大,传过来的数据应该是可以按照一定规则来解析的, 可以先把数据用一个BufferList 存起来,然后从BufferList里面取数据,解析完一个之后,再销毁掉解析完了的

@myy @liujavamail ,两位,数据量不大但是会很频繁。听你们这么一说,觉得还是分别启动Nodejs应该稳妥一下,但是web如何tcp server进行数据交互呢?放到数据库里?

是的, 传感器的数据要存到数据库里去, web这边的数据是从数据库里取出来的

做过这场景,但是量还没这么多,只是功能比这复杂一些。

  1. 数据可靠解析问题,一般是由server和设备之间约定的协议决定,协议中一般是会有数据校验算法,来保证数据的完整性,不完整则直接丢弃,如果是特定的行业,应该会有一个数据传输协议的,比如当时我们使用的国标212传输协议,里面使用的是CRC校验。
  2. 你要是觉得单点不可靠,可以考虑将tcp server单独拆分。
  3. 这个…你还是多理解一下,阻塞和非阻塞的区别。
  4. 粘包的情况可能出现在网络流量很大的情况下,这个时候还是在协议中约定了对于多个包之间使用的包分隔符,你根据分隔符切分,不完整的暂且保留,下次接收到数据时,进行合并再校验,如果不对,那就丢了吧,除非你必须要保证每个包到达。

再细节的场景我可能也没有太多经验了,帮你到这了。

@liujavamail @luoyjx 嗯嗯 明白啦:)

回到顶部