今天,完结IM即时通讯,最后的功能是群聊。
一、功能需求
在前台index.php上的群聊绑定点击事件chat_group(),该方法就是调用chating(),然后传值0,将该值通过get方法传给弹出层chat.php,在弹出层获取到uid,通过隐藏域传递js方法sends,如果是0法的话,那么就是广播群聊,就用brodcast_msg处理,在index.php建立brodcast_msg方法,通过websoket传递给workerman服务器,服务器接收到数据调用方法,如果type是brodcast_msg,那么就用类方法process_bordcast_msg处理,将处理后的数据传给前台,前台在判断,数据的uid和登陆用户的uid一直的话,就按“我“进行渲染,否则的话按其他渲染。
二、功能实现
前台点击事件
弹出层传递uid调用sends方法
//获取get传过来的uid
$uid = (int)get('uid');
if ($uid < 0) {
exit('用户ID错误');
}
//连接数据库
$db = new Db();
$title = '';
if ($uid == 0) {
//群聊
$count = $db->table('member')->count();
$title = "群聊({$count})";
}else {
//获取点击朋友的信息
$user = $db->table('member')->where(array('uid'=>$uid))->item();
$title = $user['nickname'];
}
// 发送消息
function sends(){
var to_uid = $('#uid').val();
var msg = $('.txt-chat').html();
if (to_uid == 0) {
//广播消息
brodcast_msg(to_uid, msg)
} else {
//私聊消息
private_msg(to_uid, msg);
}
$('.txt-chat').html('');
}
//广播群聊消息
function brodcast_msg(to_uid, msg) {
var data = new Object();
data.type = 'broadcast_msg';
data.to_uid = to_uid;
data.msg = msg;
ws.send(JSON.stringify(data));
}点击 "运行实例" 按钮查看在线实例
后台处理数据返回给前台
//处理群发广播消息
private function process_bordcast_msg ($data) {
global $ws_worker;
//拿到发送者用户详细信息
$send_user_json = $this->redis->hGet($this->hash_wsuid_user_key, $this->connection->uid);
$send_user_info = json_decode($send_user_json, true);
//2、遍历服务器上所有的连接
$connection_list = $ws_worker->connections;
foreach ($connection_list as $conn) {
$data['send_uid'] = $send_user_info['uid'];
$data['nickname'] = $send_user_info['nickname'];
$data['avatar'] = $send_user_info['avatar'];
$data['send_time'] = date('Y-m-d H:i:s');
$conn->send(json_encode($data));
}
}点击 "运行实例" 按钮查看在线实例
前台收到数据后渲染群聊界面
ws.onmessage = function (ev) {
console.log(ev.data);
var obj_msg = $.parseJSON(ev.data);
var myuid = $('#myuid').val();
if (obj_msg.send_uid == myuid) {
// 我发的
var html = '<div class="item me">\
<img class="avatar" src="'+obj_msg.avatar+'">\
<div class="userinfo">\
<p ondblclick="menu(this)"><span class="username" >我</span><span class="layui-badge-rim times">'+obj_msg.send_time+'</span></p>\
<div class="msg"><div class="layui-badge" style="height: 100%;max-width: 200px;background:#1E9FFF;color:#fff">'+obj_msg.msg+'</div></div>\
</div>\
</div>';
$('#msg_list').append(html);
}else {
var html = '<div class="item">\
<img class="avatar" src="'+obj_msg.avatar+'">\
<div class="userinfo">\
<p ondblclick="menu(this)"><span class="username" >'+obj_msg.nickname+'</span><span class="layui-badge-rim times">'+obj_msg.send_time+'</span></p>\
<div class="msg"><div class="layui-badge" style="height: 100%;max-width: 200px;background:#fff;color:#333">'+obj_msg.msg+'</div></div>\
</div>\
</div>';
$('#msg_list').append(html);
}
}点击 "运行实例" 按钮查看在线实例
三、总结
整个项目主要是数据在客户端(浏览器)服务器(workerman)之间的数据交互,这里用到了js点击绑定事件、ajax交互、数据库的连接、查询,还有workerman里面的提供的绑定事件等;遇到了各种坑,但是细致检查都解决了,还有各种环境插件的安装也是大费周章,甚至通宵在安装,后来全部解决,这个项目对我来说进步巨大,信心慢慢,继续加油!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号