最近写了一个聊天室在线列表实时更新的功能,通过ajax+ThinkPHP+gatewayworker 实现聊天室在线列表无刷新实时更新功能,通过这个功能的编写,发现gatewayworker确实是一个很好的系统,即使没有node.js以及socket编程经验的我,也可以轻松实现socket实时通讯及长连接通讯的功能,这个在以前是很难想象的。

以前真的准备去学node.js了,但是因为发现了gatewayworker,就可以放弃对node.js的学习了,把精力都放在功能的开发上。

通过编写在线列表的功能,使我对gatewayworker的通讯机制更进一步加深了了解,所以在这里进行一下复盘,将数据的通讯功能再整理一下。

对于前端(客户端)与socket服务器端(gatewayworker)的通讯机制,可以概括为如下:
(1)首先,前端页面整理好要发送的数据,数据必须是json格式。
(2)前端页面将json数据,通过ws.send();函数,直接发给gatewayworker服务端。
(3)gatewayworker服务端收到数据以后,再通过 Gateway::sendToUid($temp_array,json_encode());将数据发送给客户端。或者收到客户端的数据以后,就将数据存储在redis或者mysql里。
(4)客户端收到了gatewayworker服务端发送的数据以后,就去执行前端的操作,比如更新或者显示前端页面的数据。这个操作的执行,是通过ThinkPHP的控制器或者API实现的。

以上就是客户端与服务器端数据通讯的过程。数据在客户端与服务器端反复传输,每一步数据的传输都是有各自的目的的。

画了一个数据传输的结构图:
\"在这里插入图片描述\"

这个图与手册里的结构图有点类似,

\"在这里插入图片描述\"

对于服务器端推送数据给前端,我在做实时列表的时候,如果有人进入聊天室,或者有人离开聊天室,需要把这个信息实时推送给这个聊天室里的所有人,那么这个推送操作,我是用gatewayworker的Gateway::sendToUid()函数实现的。

也就是说,后端推送数据给客户端,我是使用了gatewayworker进行推送,而没有用到手册里提及的,由Thinkphp使用GatewayClient,将MVC框架数据推送给gatewayworker,再由gatewayworker分发给客户端。

可能是我做的逻辑比较简单,没有使用MVC框架来进行数据推送。

收藏 打印