博客列表 >IM即时通讯(完结 群聊功能的实现)2019年3月15日

IM即时通讯(完结 群聊功能的实现)2019年3月15日

小明的博客
小明的博客原创
2019年10月06日 14:27:031044浏览

今天,完结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一直的话,就按“我“进行渲染,否则的话按其他渲染。

二、功能实现

  • 前台点击事件

实例

// 群聊
	function chat_group(){
		chating(0);
	}

运行实例 »

点击 "运行实例" 按钮查看在线实例

  • 弹出层传递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里面的提供的绑定事件等;遇到了各种坑,但是细致检查都解决了,还有各种环境插件的安装也是大费周章,甚至通宵在安装,后来全部解决,这个项目对我来说进步巨大,信心慢慢,继续加油!

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议