博主信息
博文 42
粉丝 2
评论 0
访问量 64650
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
IM即时通讯(完结 群聊功能的实现)2019年3月15日
小明的博客
原创
1290人浏览过

今天,完结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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学