上一节讲解到,关于redis的单例模式,接下来开始讲解websocket的具体代码了。
首先需要引入一些swoole自带得类。接着就创建一个WebSocket的服务,其中里面写了,6个方法,分别是:接受消息后的回调,request请求的回调,连接时候的回调,任务投递的回调,任务投递结束后的回调,断开连接后的回调。另外用了set()函数设置运行时的各项参数。
其中前两个参数是静态页面的地址,worker_num是工作进程数,task_worker_num是Task进程的数量。
聊天室的逻辑是:首先登陆,登陆成功后保存cookies,然后页面跳转到聊天室。
因此一个用户首先第一步是到登陆页面,如何跳转到登陆页面呢?那就用用到
这边的意思就是,当你浏览的文件在当前路径下的index文件夹内,就跳转到对应的文件。假如我得路径地址是:www.xxx.com/index.html,那他就会去index文件内找是否有index.html。如果有就显示。
接着开始说,onRequest方法,由于我聊天室只是简单的做个登陆注册页面,没有做什么其他的判断,所以做的很简介。这边就是点击登陆按钮的时候,获取到前端传过来的参数,然后进行登陆或者注册,接着返回用户信息。(仅仅是为了实现功能,所以没有做过多的优化)。
接着说进入聊天页面中,获取到前端传送过来的数据后的方法
这边由于用户登录会获取到一个$fd,是swoole用来作为用户标识的,但是我们无法区分哪个用户属于哪个$fd,因此我们需要在用户进入聊天室后,主动将自己的注册信息发送过来,这边我用了type作为区分,是用户传输聊天信息,还是传输个人信息。当type为1的时候,就是传输个人信息,包括user_id,user_name.这边我用了一个任务投递得功能,下面看一下任务投递。
可以看到,我这边是将用户信息存放到redis中,并且进行类似一个广播推送,将上线用户实时得推送给在线的每个用户。至于为什么要将他写入任务投递中,首先考虑到的就是如果用户登录量过多,后期可能有其他逻辑需要处理,因此我直接扔进task中运行,这样就不影响接下去的逻辑处理,也不用进入堵塞等待状态了。