在上一篇文章中,我们简单了如何创建 webSocket 链接,
以及如何在客户端链接 webSocket 服务,发送消息等操作,
在这篇文章中,我们将简单介绍一下,
如何实现及时通讯,用户一对一聊天。
在说之前先介绍一个开源项目:SimplerWorker
这次的项目就是在这个项目的基础上进行开发的,
这个项目的安装及使用,大家可以根据文档进行操作,
(建议:先熟悉上一篇的相关流程及的操作)
当前项目已集成好 workerman 的相关服务,
我们只需要在 worker/index 控制器中添加相关业务逻辑操作即可。
php worker.php start -d
/Worker/Index/index
页面
可以看到当前状态连接成功,心跳也定时给客户端返回消息,确认连接状态。
DROP TABLE IF EXISTS `message`;
CREATE TABLE `message` (
`id` int(255) NOT NULL AUTO_INCREMENT COMMENT '表id',
`to_id` int(20) NULL DEFAULT 0 COMMENT '接收方id',
`from_id` int(20) NULL DEFAULT 0 COMMENT '发送者id',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '消息内容',
`type` tinyint(2) NULL DEFAULT 1 COMMENT '类型:1=文字,2=emoji,3=图片,4=音频',
`status` tinyint(2) NULL DEFAULT 0 COMMENT '状态:0=未读,1=已读',
`client_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'client_id',
`createtime` int(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '消息列表' ROW_FORMAT = Compact;
这里仅上了一对一聊天表,用户群聊表可根据自己的需求修改
建议去看一下这里 (Lib\Gateway类提供的接口)
看完相关接口的介绍,根据自己需求选择适当的接口进行消息推送。
Gateway::sendToAll(string $send_data [, array $client_id_array = null [, array $exclude_client_id = null [, bool $raw = false]]]);
向所有客户端或者client_id_array指定的客户端发送$send_data数据。如果指定的$client_id_array中的client_id不存在则自动丢弃
Gateway::sendToClient(string $client_id, string $send_data);
向客户端client_id发送$send_data数据。如果client_id对应的客户端不存在或者不在线则自动丢弃发送数据
Gateway::sendToUid(mixed $uid, string $message);
向uid绑定的所有在线client_id发送数据。
注意:默认uid与client_id是一对多的关系,如果当前uid下绑定了多个client_id,则多个client_id对应的客户端都会收到消息,这类似于PC QQ和手机QQ同时在线接收消息。
Gateway::sendToGroup(mixed $group, string $message [, array $exclude_client_id = null [, bool $raw = false]]);
向某个分组的所有在线client_id发送数据。
说明:
在推送消息的同时,我们要将用户发送的消息保存到数据库,
语音及图片的聊天,我们只需先调用文件的上传,
然后将返回的文件保存即可,注意选择消息的类型。
本文为冯奎原创文章,转载无需和我联系,但请注明来自冯奎博客fengkui.net
最新评论