自定义的通讯协议 是如何进行连接的呢

weywey

像websocket协议,我能理解。

前端 new WebSocket后,输入对应的ws服务的地址就可以实现连接,但是如果是tcp协议或者新定义的一个协议,又该怎么去实现客户端与服务端的连接与数据传输呢

207 2 2
2个回答

walkor

浏览器不支持自定义协议,一般只能用http websocket协议

  • weywey 26天前

    谢谢大佬 ,像咱们框架内自带的 frame、text协议或者自定义的 JSONL ,客户端是怎么连接上的呢

  • walkor 26天前

    php里用stream_socket_client,文档有示例

  • weywey 26天前

    好 谢谢

  • weywey 24天前

    还有一个问题 大佬 我的tcp客户端是网络控制器,tcp客户端有自身的心跳机制,心跳内容固定是 ¥YJ58BF25D6E65D$ ,在我获取这个数据时 我原本应该直接回复这个数据,所以在onmessage 时 我给了一个一个if($message=="¥YJ58BF25D6E65D$"){
    Gateway::sendToClient($client_id, $message);
    }

    然而我发现设备总是断开 ,结果打印了一下 $message,结果是 �YJ58BF25D6E65D$ ,所以导致一直没有回复心跳,这是啥原因导致的转义呢

  • walkor 24天前

    workerman不会随意更改数据,说明客户端发的数据就是 �YJ58BF25D6E65D$,�可能是协议头,具体你要看他们协议文档

xiaopi

其实自定义协议就是TCP协议,只不过TCP发送没有边界,可能几次发送合并到一起发过来,或者大段内容拆分成多次发过来,这样就需要开发者自己合包或者拆包,比较麻烦,解决方法有一种就是发送方和接收方约定好使用固定结束标识符,用来告诉接收方,我还没发送完成,你等我发送完,直到看到约定的结束符或者我发的包含了多次,你需要根据结束符拆分成多个包使用。而workerman自定义协议就是约定好了结束符,自动处理了分包合包的问题,就不会出现TCP边界问题了,当然客户端使用时,也需要使用自定义协议中规定的结束符

🔝