文档章节

GatewayWorker整合web系统开发多人分组在线聊天的步骤

高处胜寒
 高处胜寒
发布于 2018/04/23 11:23
字数 978
阅读 78
收藏 0

现在需要在web系统的基础上整合多人分组聊天。

一、原则

gateway-worker的文档中已经有了一个大概的描述,地址:

主要的原则就是:

  • 客户端连接websocket服务的时候,才需要websocket服务器
  • websocket服务器主要的作用是返回$client_id
  •  
  • 需要发送消息、加入分组的操作由web服务器调用 gatewayClient 来完成

二、具体实施步骤

1. 开启websocket服务器,监听一个端口如8282

2. 设置websocket服务器 onConenct()事件,监听客户端连接

将客户端连接(比如使用js wesocket进行连接)的时候,会生成一个 $client_id ,将这个client_id返回给客户端

3. 客户端连接websocket服务,用户消息的发送和接收

初次连接websocket,会收到websocket发送给客户端的client_id,这个client_id用于向web系统声明自己再websocket方面的身份

4. 向web服务器发送ajax请求,将自己的client_id,所在的分组(如房间号)发送给web服务器

5. web服务器接收client_id和房间号,然后将client_id和房间号绑定

这个过程如果需要结合userid,可以从session或者某个登录状态获取用户的userid,这样子就能将其绑定,不过一般将client_id和房间号进行绑定就可以了。

6. 绑定成功后,客户端本身就连接着websocket,不会断掉,会继续监听消息

7. 客户端如果触发发送消息的操作,则向web服务器发送ajax请求。

同时将其client_id和roomid(房间号)发送过去,其实clientid不是必须的,不过如果为了保险起见,再加一层验证就需要了。

8. web服务器接收到发送消息的请求后,将client_id判断是否是这个房间号的,饭后将消息发送给这个房间号的所有成员。

在web服务器上发送消息,同样是结合 gateway-client 来完成的

9. 所有的客户端监听来了消息之后,将消息显示即可。

很关键的一点在于,当连接成功的时候,websocket也会向自己发送一条消息,因此就需要进行两种消息的区别,目前我才用的是json数据包含某个特定参数的方式

也就是说,javascirpt的 onMessage 事件监听两个不同的数据,通过switch进行判断,如果接收到的数据有type这个key并且有init这个value,则说明是初次连接,如果没有type或者type不是init,则说明是接收到的其他的参数。

就像是下面的代码:

 // 服务端主动推送消息时会触发这里的onmessage
    ws.onmessage = function(e){
        // console.log(e.data);
        // json数据转换成js对象
        var data = eval("("+e.data+")");
        var type = data.type || '';
        switch(type){
            // Events.php中返回的init类型的消息,将client_id发给后台进行uid绑定
            case 'init':
                // 利用jquery发起ajax请求,将client_id发给后端进行uid绑定
                $.post(ajaxUrl, {client_id: data.client_id,room:roomId}, function(data){
                    // console.log(data);
                }, 'json');
                break;
            // 当mvc框架调用GatewayClient发消息时直接alert出来
            default :
                // 如果登陆用户的guid和数据发送者的guid一样,则使用不同的颜色(只能自己看到)
                if(loginUser == data.user){
                    addMsgToHtml(data.message,'#F37B1D');
                    break;
                // 如果发送者的guid和主播uid一样,则对所有的显示都增加一个[主播标识]
                }else if(data.user==roomUser){
                    addMsgToHtml("[主播] "+data.message,'#0e90d2');
                    break;
                }else{
                // 其他的就正常发送消息
                    addMsgToHtml(data.message,'#333');
                }
                break;
        }
    };
 

 

 

 

三、图示

一个图示,点击可以查看大图:

QQ截图20170502234050.jpg

http://www.ptbird.cn/gateway-worker-many-people-chat-online-group.html

http://www.ptbird.cn/gateway-worker-chat-online-group.html

 

 

 

拓展阅读:

https://segmentfault.com/a/1190000012971998

https://github.com/nick-bai/laychat

https://www.jianshu.com/p/f9500f4ceed1

https://www.imooc.com/article/17962?block_id=tuijian_wz

https://www.kancloud.cn/nickbai/laychat/288137

https://blog.csdn.net/u010136741/article/details/51612594

 

推荐

http://www.ptbird.cn/gateway-worker-many-people-chat-online-group.html

推荐

https://blog.csdn.net/lanlan945/article/details/79465106

推荐【思路】

http://www.ptbird.cn/gateway-worker-chat-online-group.html

本文转载自:https://blog.csdn.net/lanlan945/article/details/79465106

高处胜寒

高处胜寒

粉丝 9
博文 213
码字总数 148499
作品 0
西安
程序员
私信 提问
美丽播直播直播系统解决方案:1000在线服务器方案

美丽播在直播系统开发中有许多直播解决方案,在很多直播平台不知道如何购买服务器的时候,美丽播也会根据直播平台实际情况进行推荐如何选择使用服务器。平台运营根据在线人数估值来定,配置情...

suanleba
2017/10/23
60
0
开发一个网络视频会议系统 需要具备什么方面的知识 ? 使用什么编程语言较为高效?

想请问 开发一个网络视频会议系统 需要具备什么方面的知识 ? 使用什么编程语言较为高效? 基于客户端聊天室开发的 主要 功能 (在线多人视频、支持智能终端、视频即时录制、会议室白板、交互大...

AlwaysOnlinefeiying
2013/03/20
695
1
GatewayWorker做个简单的聊天demo

简单的聊天demo:GatewayWorker demo来实现。 1. GatewayWorker3.0.7 在CentOS7.4 PHP7.1下安装: 参考:http://www.workerman.net/gatewaydoc/ 最新的GatewayWorker下载: https://github.c......

MichaelShu
2018/04/15
662
0
websocket多人聊天室

著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:潘良虎 链接:http://www.zhihu.com/question/20215561/answer/26419995 来源:知乎 Web领域的实时推送技术,...

james_laughing
2015/11/23
2.1K
2
基于开源 Openfire 聊天服务器 - 开发Openfire 聊天记录插件

上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfire插件。一步步很详细的介绍到简单插件开发,带Servlet的插件的开发、带JSP页面插...

ibm_hoojo
2013/03/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

会用python把linux命令写一遍的人,进大厂有多容易?

看过这篇《2000字谏言,给那些想学Python的人,建议收藏后细看!》的读者应该都对一个命令有点印象吧?没错,就是 linux 中经常会用到的 ls 命令。 文章中我就提到如何提升自己的 python 能力...

上海小胖
10分钟前
1
0
HashMap的特性

一、hashmap数据结构:哈希表结构:数组+链表 hashmap调用默认构造方法会产生一个默认底层是长度为16的Entry数组,首先调用key的hasCode()方法来得到一个整数, int hash = hash(key.hashCode...

GGbird
11分钟前
2
0
第五章 spring-connet之Imports注解来龙去脉

前言 imports是一个在spring体系里非常重要的注解,基本每个Enable开头的注解必然有一个import注解。接下来我们深入研究下import的作用。看小节的同学建议先取看PostProcessorRegistrationDe...

鸟菜啊
14分钟前
1
0
CentOS部署Harbor镜像仓库

关于Harbor Harbor是用于存储和分发Docker镜像的镜像仓库服务,相比Docker Registry,Harbor在安全、标识、管理等方面做了增强,更适合企业使用; 官方网站:https://goharbor.io/ 官方开源:...

程序员欣宸
19分钟前
1
0
JavaScript调试必会的8个console方法

每个JavaScript开发者都用过console.log()来调试程序,但实际上Console对象还提供了很多其他方法可以提高调试效率。本文将介绍8个有趣的Console方法,即使JavaScript老手也不一定知道! 1、c...

汇智网教程
40分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部