关于Gateway/worker多协议支持的问题

leo

支持多协议还有其他的方法,比如通过协议自身的特点区分当前是哪种协议,然后分别调用相应协议的解码方法,这样可以做到只开一个端口就可以支持多种协议的效果

这种不通过端口,通过协议本身特点区分协议,只能区分简单的协议(比如text,json的)吧?如果是hex格式的就没有办法根据协议来区分吧。

3751 3 0
3个回答

walkor

复杂的协议也一样。每个协议的特征都是不一样的,手册中只是举个例子,具体怎么区分还要靠自己来琢磨,别人不知道你的hex协议具体规则。

  • 暂无评论
leo

之前表述有点问题,hex是数据格式。如果协议本身就是将数据进行pack后再传输,因为pack的数据格式支持的种类比较多,通过接收的数据流是无法区分使用的pack格式的。
举例:
A厂商设备使用pack(H, data)对协议数据进行组包, H表示使用十六进制高端字节序组包
B厂商设备使用pack(h, data)对协议数据进行组包, h表示使用十六进制低端字节序组包
C厂商设备使用pack(C, data)对协议数据进行组包, C表示使用无符号字节组包

那么通过数据流只能知道是组包的,但是无法区分使用的组包方式,即无法区分协议。

这种情况下,就只能通过端口来区分协议,对吧?但是通过端口的方式区分协议,如果后续增加了协议,那么就需要重启gateway,这样之前协议监听端口上的链接就都会释放然后等待终端重新连接。

有没有什么更好的办法来处理这种多协议?谢谢!

  • 暂无评论
walkor

协议区分一般是要在协议头放一个字节来区分的,根据这个字节的值判断是哪个厂商的协议。
另外每个厂商的协议不一样,这个是不科学的,应该所有厂商的协议都一样,只是协议体中数据格式不一样。

如果你的协议里面没有区分协议的字段,建议用多端口支持多协议。
Gateway支持独立部署的,可以单独增加Gateway服务,不用重启服务器,简单的说就是新建一个start_gatewayxxx.php,配置好,然后php start_gatewayxxx.php start -d就好了,这样就启动了一个新的Gateway服务支持新的协议,业务代码不用任何更改。
见手册:http://www.workerman.net/gatewaydoc/advanced/multi-protocols.html

甚至可以把Gateway服务单独部署在其它服务器上支持多协议。
见手册:http://www.workerman.net/gatewaydoc/gateway-worker-development/gateway-worker-separation.html

  • 暂无评论
年代过于久远,无法发表回答
🔝