需要在系统的不同部分之间实现双向数据交换。目前,系统包含:
通过rest api与外部用户交互的模块,在nodejs上实现;
实现业务逻辑和与数据库交互的模块是用qt实现的;
计划:
- web muzzle为了方便与实体用户的系统交互,会用reactjs来写。
现在在 nodejs 和 qt 之间,数据正在通过网络套接字发送。据他们说,我们还计划与 web face 交换数据。还有就是需要将组成qt模块的插件分离到不同的进程中。
如果通过 web sockets 与前端交换数据不会造成尴尬,那么使用它们来组织 qt 进程之间以及它们与 nodejs 之间的交换,就会令人困惑。考虑到 qt 插件和 nodejs 应用程序在同一台服务器上,是否有更合适的技术。
进程之间有多种交互方式。例如,它可以使用简单的 TCP 套接字来组织。开箱即用的node.js 对此提供了支持。Qt 为此使用QTcpSocket。这是最简单的选择,因为那里和那里都有开箱即用的支持,而且我们有异步 IPC 作为输出。
另一种选择是使用共享内存。显然,有一些 node.js 的附加组件增加了对它的支持。Qt 有一个现成的QSharedMemory类。这种方法更糟糕,因为 需要额外的插件并且它是同步的(你需要“轮询”共享内存)。
继续:D-Bus。Node.js 有一个插件,Qt 也有一个:Qt D-Bus。
当然,你也可以想其他的办法。以上哪个更好?我认为最简单和最方便的方法是使用常规的 TCP 套接字。
面向数据包的 UDP 套接字非常适合请求-响应交互的组织。不同于面向流的,多个写命令写入的数据可以一次读取,反之亦然,对于UDP,一个写命令对应一个读命令。通过这种方式,单个请求或响应被打包成单个批次并在单个调用中接收,
read或者recv在 QtreadDatagram中,在 node.js 中,在事件处理程序中接收'message'。由于交换发生在同一台机器内,您不必担心数据包丢失。