gateserver 游戏服务器 gate怎么 给 前端 发送消息

Lync Server 2013功能部署系列之四 Lync Server前端部署 - 服务器技术综合 - 次元立方网 - 电脑知识与技术互动交流平台
Lync Server 2013功能部署系列之四 Lync Server前端部署
实验服务器拓扑
一、Lync前端部署概述
在上一篇已经准备好了lync server 必须的后端SQL数据库,接下来就可以安装配置lync 13 前端服务器了(受实验环境制约就不写前端的高可用部分了,生产环境建议使用硬件设备的前端高可用方案)安装过程和10过程基本一致即: www.it165.net
a)扩展AD的架构,扩展前确认当前的林,域功能级别至少是Windows Server 2003,一般使用隶属于Schema Admins 组的administrator 执行扩展和安装过程,待系统运行稳定后根据IT管理实际需求分配角色来管理Lync Server。下图是完成扩展AD架构,Lync自动创建的组,例如隶属于CSUserAdministrator的账号可以启用或禁用用户的Lync功能,各种策略的分配等工作。
b)内部DNS 区域添加相应的资源记录(和2010一致)
c)安装管理工具,使用拓扑生成器定义并发布拓扑。个人感觉2013的拓扑变化较大,例如可以和Lync 2010的拓扑共存;A/V 会议服务需要和前端并置;监控和存档也要和前端并置不能单独存在;存档数据可以集成在Exchange 2013数据库中;新增了Office Web Apps Server(WAC)和持久聊天(支持旧群聊服务器迁移)服务器;SQL 镜像的配置比较容易,并且支持各种角色的数据库存储。本实验是针对企业版池的,如果部署标准版池必须并置SQL Server Express版本的数据库,这样就无法实现后端的高可用功能了。
d)安装本地配置存储,Lync组件
e)配置前端证书,2013新增加了一种服务器间的身份验证类型证书OAuth(一种用于服务器到服务器身份验证和授权的标准协议)例如要和 Exchange 2013,SharePoint Server ,Office 365之间进行身份验证。
f)启动服务
g)创建测试账号登陆Lync验证前端的部署,验证SQL Server高可用。
二、以下是在lsfe1上的安装配置过程
1.安装前的Windows准备,打开服务器管理器,添加功能,勾选HTTP激活
2.勾选Windows 身份验证
3.勾选Windows Identity Foundation 3.5,进行组件安装直到结束。
4.插入WS2012介质(例如在y:\路径下),使用管理员打开Windows PowerShell 运行如下命令添加其他Windows必须的组件:
Add-WindowsFeature RSAT-ADDS, Web-Server, Web-Static-Content, Web-Default-Doc, Web-Http-Errors, Web-Asp-Net, Web-Net-Ext, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Http-Logging, Web-Log-Libraries, Web-Request-Monitor, Web-Http-Tracing, Web-Basic-Auth, Web-Windows-Auth, Web-Client-Auth, Web-Filtering, Web-Stat-Compression, Web-Dyn-Compression, NET-WCF-HTTP-Activation45, Web-Asp-Net45, Web-Mgmt-Tools, Web-Scripting-Tools, Web-Mgmt-Compat, Desktop-Experience, Telnet-Client, BITS -Source y:\sources\sxs
5.插入ls13安装介质,运行lync 安装程序,点是,点安装
6.自动弹出部署向导,点准备 Active Directory
7.准备架构,按照默认的选项,下一步
8.等待扩展成功完成
9.准备林,下一步
10. 按照默认的选项,下一步
11. 等待扩展成功完成
12.准备域,下一步
13. 等待扩展成功完成
14.使用ADUC将example\administrator 添加到CSAdministrator组
15.登陆DC打开DNS控制台在本地域添加Lync相应服务的资源记录pool,admin,meet,dialin,lyncweb,如果是用户不同于内部域名登陆的情况留到以后的文章讨论
16.添加支持客户端自动登陆的SRV 记录,提供此服务的主机为Lync 池FQDN
17.配置完成必要的DNS资源记录回到lsfe1继续安装管理工具
18.打开拓扑生成器,选择新建拓扑
19.填写AD的域名
20.填写Lync站点名称
21.填写Lync 池 FQDN
22.添加lsfe1 FQDN
23.勾选部署的功能,存档和监视留到后面配置
24.这里选择了和前端并置中介服务器
25.跳过边缘池关联
26.这里是高可用SQL 镜像拓扑的配置,根据内容分别填写lsbe1,lsbe2,lsbe witness 的FQND,使用默认的实例,勾选相应的关系,端口保持默认
27.定义新的文件存储,本实验在lsbe witness 上创建了共享文件夹lync-share,赋予everyone 读取的权限
28.填写Web服务URL的外部DNS资源记录名称(微软推荐使用TMG做反向代理发布,但是通常的情况下可能没有TMG或是没有反向代理服务器,那么简单的方式是通过硬件防火墙映射到公网)
29.WAC服务器留到后面配置
30.在Lync Server 根节点编辑拓扑属性,添加内部的管理访问URL,点击要安装中央管理服务器的前端服务器位置下拉项,选择上面刚刚新建的Lync池
31.在企业版前端池节点编辑属性,勾选存档和监视的高可用SQL Server存储
32.在持久聊天池节点,新建持久聊天池,填写服务器FQDN,选择单计算机池,持久聊天服务器的高可用留到以后讨论。
33.填写池显示名称,端口使用默认,勾选使用*****的默认池(U)
34.勾选持久聊天使用的SQL 存储
35.选择使用的文件存储
36.在WAC节点新建WAC服务器,第一栏填写WAC的FQDN,第二栏填写https://WACFQDN/hosting/discovery/ 确定保存
37.至此可以发布拓扑了
38.勾选lsbe1
39.勾选lsbe2,并添加之前章节创建好的共享文件夹路径
40.点击下一步,等待发布成功完成,检查SQL 数据库镜像配置状态是否正常
41.安装lync组件,按向导默认的配置进行
42.请求分配默认证书过程按照向导默认的配置向集成AD证书颁发机构进行请求(本实验在DC上事先安装了证书颁发机构),注意选择证书的位长度为2048,否则与Exchange 2013集成会有问题,选择&将证书的私钥标记为可导出&
43.请求分配OAuth 证书过程同默认证书请求过程
44.启动Lync 前端服务,检查服务是否正在运行,Lync 前端的部署配置到此完成
45.接下来安装最新版的Silverlight程序,使用Lync 控制面板启用两个Lync 用户做测试验证基本的 IM,会议功能是否正常,以及尝试重启一台SQL Server 看是否可以自动故障转移
延伸阅读:
目的:通过挂载的方式,可以类似访问本地磁盘的方式一...
本教程为 李华明 编著的iOS-Cocos2d游戏开发系列教程:教程涵盖关于i......
专题主要学习DirectX的初级编程入门学习,对Directx11的入门及初学者有......
&面向对象的JavaScript&这一说法多少有些冗余,因为JavaScript 语言本......
Windows7系统专题 无论是升级操作系统、资料备份、加强资料的安全及管......服务器设计(2)
笔者介绍:,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你3D游戏引擎》电子工业出版社和《实战核心技术详解》电子工业出版社等。 在上篇中给读者介绍了如何学习游戏服务器,主要针对的是想学习游戏服务器编程的开发者。学习服务器编程,也是一个循序渐进的过程,学习知识还是要用于实践开发的,实践开发的最好方式就是去公司参与项目开发,这样才能真正的锻炼自己的技能。本章介绍一下在知名IT公司中通常使用的游戏服务器架构设计,以及它们的编写处理方式。 一款成熟的游戏服务器,它的技术是建立在成熟产品上的,也就是说经历过上线产品验证的服务器都是可以学习的。服务器的设计其实比较复杂,本篇文章主要是介绍两种服务器,这两种服务器都是经过成功产品验证过的,一种是不带有负载均衡的,另一种是带有负载均衡的服务器,这里给读者一一介绍。 第一种服务器是不带有负载均衡的,先介绍一下服务器的基本结构,直接看图如下所示:这种架构的服务器在很多IT公司使用,它是针对的MMORPG或者MMORAPG大型游戏设计的,带有场景服务器的,这里的场景服务器,可以继续分解出Fight服务器以及其他服务器。先介绍各个功能服务器:CenterServer 服务器管理器,管理所有的服务器,分配服务器的端口, 负责全局的逻辑DBServer 角色档案cache服务器GameServer 逻辑服务器GateServer 网关服务器,负责消息转发LoginServer 登录服务器, 连接账号数据库,检测用户名和密码再介绍服务器的基本流程:用户从客户端选择游戏服务器列表,登录到LoginServer,在这个过程中先去平台服务器进行帐号的验证是否正确,通过后会通知LoginServer,然后LoginServer把验证正确的信息发送消息到CenterServer, 请求其中的GateServer的地址和端口,CenterServer找一个可用的GateServer的信息, 发送回LoginServer。LoginServer再把消息发送给客户端,然后客户端断开与LoginServer的链接,然后在与GameServer服务器链接进入到游戏场景中。 在这里注意的是GateServer与GameServer是一对一的关系,换句话说,每个GameServer能容纳的玩家数量是一定的,一旦达到GameServer的最高峰值,它就会找下一个GateServer对应的GameServer,各个GateServer服务器之间是不通信的。当然玩家的实时同步是在GameServer服务器中实现的,实时同步在服务器中的处理也是游戏服务器中的核心技术点,后面会结合着代码讲解。接下来介绍具有负载均衡服务器,先看图如下所示:负载均衡服务器与没有负载均衡服务器之间的区别是GateServer与GameServer之间的关系,没有负载均衡的服务器GateServer与GameServer之间是一对一的关系,而且各个GateServer之间是不通的。正常情况下一个GateServer对应一个GameServer实时在线人数能达到3000人以上。具有负载均衡的服务器,一个GateServer对应多个GameServer,而且最重要的一点是多个GateServer之间可以互相通信。而且可以随意扩展,通过配置文件既可以实现配置。配置文件事例如下所示: &TableIndex& :
&CenterServer&,
&LoginServer&,
&GateServer&,
&GameServer&,
&DatabaseServer&
&CenterServer& :
&UUID& : 0,
&Group& : 0,
&ServerType& : &Single&,
&ListenPort& : 30000,
&mysql& : &mysql://root:.168.1.11:3306/gamedata&
&LoginServer& :
&UUID& : 1,
&Group& : 0,
&ServerType& : &Single&,
&ListenAddr& : &192.168.1.11&,
&ListenPort& : 30100
&DatabaseServer& :
&UUID& : 2,
&Group& : 0,
&ServerType& : &Single&,
&ListenAddr& : &192.168.1.11&,
&ListenPort& : 30200,
&mysql& : &mysql://root:.168.1.11:3306/gamedata&
&GateServer& :
&UUID& : 10,
&Group& : 0,
&ServerType& : &Multiple&,
&ListenAddr& : [&192.168.1.11&],
&ListenPort& : [ 30300],
&ServerProxy& :
&GameServer&
&GameServer& :
&UUID& : 20,
&Group& : 0,
&ServerType& : &Multiple&,
&ListenAddr& : [&192.168.1.11&],
&ListenPort& : [ 30400],
&ServerProxy& :
&DatabaseServer&,
& & &网络消息传输建议使用Google开源的库Protobuf-net,使用文本文件定义的消息结构体,可以通过它自带的工具转化成C#和C++,然后将生成的文件放到工程中直接调用所定义的结构体即可。& & & 最后,如果读者感兴趣可以学习开源框架Node.js,这个对于初学者门槛比较低,它也可以处理负载均衡问题,网上参考资料非常多。后面会介绍各个服务器的代码编写以及核心模块的介绍实现。敬请期待。。。。。。。。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:70069次
积分:1812
积分:1812
排名:第18670名
原创:105篇
评论:82条
难度:中级
类型:实战教学
难度:中级
类型:实战教学
难度:中级
类型:实战教学
《Unity3D实战核心技术详解》电子工业出版社 《手把手教你架构3D游戏引擎》电子工业出版社
文章:11篇
阅读:6634
文章:30篇
阅读:23949
文章:12篇
阅读:3968
文章:16篇
阅读:11108
(4)(30)(62)(10)pomelo分布式聊天服务器详解
说来也惭愧,知道pomelo框架已经一年有余了,最近因为有开发IM的需求,但却是第一次部署安装pomelo框架,对不起网易开发团队的朋友~pomelo
说来也惭愧,知道pomelo框架已经一年有余了,最近因为有开发IM的需求,但却是第一次部署安装pomelo框架,对不起网易开发团队的朋友~
部署这个聊天demo非常简单,去github上下载这个聊天室的源代码,然后根据wiki里的程序安装依赖,并且分别启动pomelo的game server和web server。
代码下载地址:
我刚运行这个聊天室程序的时候确实有点迷糊,看了wiki上的架构图又是web server,又是gate server,还有多个connecter,还有chat server等等,在config .json里可以进行相关的一些配置:
&development&:{
& & & & &connector&:[
& & & & & & &{&id&:&connector-server-1&, &host&:&127.0.0.1&, &port&:4050, &clientPort&: 3050, &frontend&: true},
& & & & & & &{&id&:&connector-server-2&, &host&:&127.0.0.1&, &port&:4051, &clientPort&: 3051, &frontend&: true},
& & & & & & &{&id&:&connector-server-3&, &host&:&127.0.0.1&, &port&:4052, &clientPort&: 3052, &frontend&: true}
& & & & &],
& & & & &chat&:[
& & & & & & &{&id&:&chat-server-1&, &host&:&127.0.0.1&, &port&:6050},
& & & & & & &{&id&:&chat-server-2&, &host&:&127.0.0.1&, &port&:6051},
& & & & & & &{&id&:&chat-server-3&, &host&:&127.0.0.1&, &port&:6052}
& & & & ],
& & & & &gate&:[
& & & & & &{&id&: &gate-server-1&, &host&: &127.0.0.1&, &clientPort&: 3014, &frontend&: true}
其中frontend表示此服务器可以被用户请求到,clientPort表示此服务器对外的端口号,port表示此服务器对内部的rpc调用端口号。
启 动好服务器之后,我们在浏览器地址栏中输入:http://127.0.0.1;3001/index.html就可以正常登录进行聊天了。从入手, 我们先简单看一下前端页面的js代码,在web-server的public文件夹中存放了前端用到的html和js代码。
client.js就是整个聊天室用到的前端js代码,它的结构如下:
1、定义了很多用到的变量
2、定义了用来判断输入合法性的util对象
3、定义很多操作dom元素的function函数
4、定义queryEntry方法,这个方法比较重要,下面单独说明
5、定义很多事件,用来接收pomelo服务器响应的东西
6、对login按钮进行绑定click事件
7、对发送消息entry按钮绑定click事件
我们单独看下queryEntry方法,代码如下:
// query connector
function queryEntry(uid, callback) {
var route = 'gate.gateHandler.queryEntry';
pomelo.init({
host: window.location.hostname,
port: 3014,
}, function() {
pomelo.request(route, {
}, function(data) {
pomelo.disconnect();
if(data.code === 500) {
showError(LOGIN_ERROR);
callback(data.host, data.port);
其中我们看到pomelo.init方法,传入了host,port和log的参数,同时在回调函数里面使用pomelo.request方法将uid发送出去,在回调函数里断开连接,最后执行callback,将返回的data数据的host和port传入callback。
反正我第一次看这段代码是一头雾水,这个queryEntry函数是在用户点击登录之后执行的,我们打开public/js/lib/pomeloclient.js文件,找到init函数,代码如下:
pomelo.init = function(params, cb){
& & pomelo.params = params;
& & params.debug = true;
& & var host = params.host;
& & var port = params.port;
& & var url = 'ws://' + host;
& & if(port) {
& & & url += &':' + port;
& & socket = io.connect(url, {'force new connection': true, reconnect: false});
& & socket.on('connect', function(){
& & & console.log('[pomeloclient.init] websocket connected!');
& & & if (cb) {
& & & & cb(socket);
& & socket.on('reconnect', function() {
& & & console.log('reconnect');
& & socket.on('message', function(data){
& & & if(typeof data === 'string') {
& & & & data = JSON.parse(data);
& & & if(data instanceof Array) {
& & & & processMessageBatch(pomelo, data);
& & & } else {
& & & & processMessage(pomelo, data);
& & socket.on('error', function(err) {
& & & console.log(err);
& & socket.on('disconnect', function(reason) {
& & & pomelo.emit('disconnect', reason);
其 实上述代码就是利用socket.io于远程服务器建立连接,并且把socket对象传入回调函数。另外pomelo.request方法就是向这个 socket发送数据,注意了整个pomelo对象是一个单例,所以我们在使用pomelo对象时同时只能连接一个服务器,所以代码中在连接gate服务 器之后,获得connector服务器的主机名和端口就需要使用pomelo.disconnect();方法关闭这个连接,从而重新init连接被分配的connector服务器。
我们重点看下,这个route变量:
var route = 'gate.gateHandler.queryEntry';
这个地址就代表着gate服务器的方法地址,其中gateHandler表示文件名,queryEntry表示exports对外的方法名,通过前端的如下代码:
pomelo.request(route, {
},function(){..
我们就把uid发送到了gate服务器中的handler文件夹中,gateHandler.js这个文件里的queryEntry方法中了。在queryEntry 方法中,其实什么事情都没有去做,只不过将用户uid根据哈希算法分配到一台connector服务器,gate并不会去做路由转发,而是直接返回给客户 端connector的host和port,所以我们就看到了上述代码中前端关闭与gate服务器的连接,将收到的信息host和port传给 callback函数了。
通过上述这些代码,我们基本了解到web服务器主要就是用来展现静态资源的,把他换成nginx或者apache都可以。而gate服务器也是独立与系统的,它的作用也不过是根据用户名来哈希计算分配给这个客户端的connector地址。
1、用户登录登出过程:
接下来我们看下,用户第一次进入页面,点击登录按钮发生了什么?代码如下:
queryEntry(username, function(host, port) {
pomelo.init({
host: host,
port: port,
}, function() {
var route = &connector.entryHandler.enter&;
pomelo.request(route, {
username: username,
}, function(data) {
if(data.error) {
showError(DUPLICATE_ERROR);
setName();
setRoom();
showChat();
initUserList(data);
queryEntry函数我们之前已经分析过了,回调函数接收的host和port值就是gate服务器分配的connector地址,我们使用同样的pomelo.init方法连接上connector服务器,然后调用远程地址&connector.entryHandler.enter&,将rid和username传给这个方法,当远程执行完毕之后,让此用户进入聊天室。这里我们打开connector文件夹下的entryHandler.js,查看enter方法:
handler.enter = function(msg, session, next) { var self = this; var rid = msg.rid; var uid = msg.username + '*' + rid var sessionService = self.app.get('sessionService'); //duplicate log in if( !! sessionService.getByUid(uid)) { next(null, { code: 500, error: true }); return; } session.bind(uid); session.set('rid', rid); session.push('rid', function(err) { if(err) { console.error('set rid for session service failed! error is : %j', err.stack); } }); session.on('closed', onUserLeave.bind(null, self.app)); //put user into channel self.app.rpc.chat.chatRemote.add(session, uid, self.app.get('serverId'), rid, true, function(users){ next(null, { users:users }); }); };
这里用到的pomelo的api比较多,我们逐一解释,
首先我们先获取session服务
var sessionService = self.app.get('sessionService');
然后通过下面的代码,判断这个用户是否已经存在了,如果已经存在那么就要返回error错误
if( !! sessionService.getByUid(uid)) {
next(null, {
code: 500,
error: true
下面的代码是绑定用户uid到session中,并且将这个uid更新房间rid的session,然后利用push方法下发同步session,当session触发关闭事件后,就执行onUserLeave方法,并且绑定它的第一个参数是app
session.bind(uid);
session.set('rid', rid);
session.push('rid', function(err) {
console.error('set rid for session service failed! error is : %j', err.stack);
session.on('closed', onUserLeave.bind(null, self.app));
这天通过app的rpc远程调用chatRemote.js的add方法,将一些参数传入,等待远程返回users对象,然后将users返回给客户端。
self.app.rpc.chat.chatRemote.add(session, uid, self.app.get('serverId'), rid, true, function(users){
next(null, {
users:users
最后是用户离开的函数,远程调用kick方法,将用户剔除。
var onUserLeave = function(app, session) {
if(!session || !session.uid) {
app.rpc.chat.chatRemote.kick(session, session.uid, app.get('serverId'), session.get('rid'), null);
connector服务器的代码分析完了,主要作用就是将session绑定用户id,同时同步和下发session到chatserver中去,让chatserver在处理聊天的时候可以获取到用户身份。
接下来打开chat/remote/chatRemote.js文件,看下add和kick方法是怎么定义的。
先定义一个ChatRemote类,通过app.get获取'channelService'服务,这个上面的sessionService一样,拿到channelService对象之后,我们调用this.channelService.getChannel(channel_name,flag), 获取一个指定频道,通过查看pomelo的api文档我们可知,第二个参数flag如果为true,如果没查找到这个channel,那么就会去创建这个 channel。
然后通过channel.pushMessage(param);方法向这个频道的所用客户端广播,这将触发client.js的onAdd事件,同时将用户名作为参数传入。
channel.add(uid, sid);这里将新登录的用户uid和connector_server_id添加到此频道中去。然后通过将this.get方法的返回值作为参数,传给回调函数函数。
var ChatRemote = function(app) {
this.app = app;
this.channelService = app.get('channelService');
ChatRemote.prototype.add = function(uid, sid, name, flag, cb) {
var channel = this.channelService.getChannel(name, flag);
var username = uid.split('*')[0];
var param = {
route: 'onAdd',
user: username
channel.pushMessage(param);
if( !! channel) {
channel.add(uid, sid);
cb(this.get(name, flag));
我们看一下this.get函数做了什么事情,他的功能就是获取这个频道下面所有用户的uid数组
ChatRemote.prototype.get = function(name, flag) {
var users = [];
var channel = this.channelService.getChannel(name, flag);
if( !! channel) {
users = channel.getMembers();
for(var i = 0; i & users.length; i++) {
users[i] = users[i].split('*')[0];
return users;
我们通过connector的next函数,将这个用户数组传递给前端的回调函数执行,这样就将用户uid的列表正常返回给前端的client.js了。
另外一个kick的方法比较简单,主要就是将用户id从channel中剔除,然后触发用户的onLeave事件,告知这个channel中的用户此uid已经离开了。
ChatRemote.prototype.kick = function(uid, sid, name, cb) {
var channel = this.channelService.getChannel(name, false);
// leave channel
if( !! channel) {
channel.leave(uid, sid);
var username = uid.split('*')[0];
var param = {
route: 'onLeave',
user: username
channel.pushMessage(param);
至此,我们对用户进入聊天室和登出聊天室的功能已经有所了解了,下面我们要分析一下用户发送消息的广播和单播功能的实现。
2、消息广播和单播实现
我们还是打开public/client.js文件,找到用户发送消息的代码,如下:
代码中先定义了chat.chatHandler.send,这将直接使前端通过rpc调用chatHandler.js中的send方法。代码中还加入了一些合法性验证和去除空格的东西,核心代码是pomelo.request这段,前端将rid(频道名),content(消息内容),from(发送方用户id),target(接收方)作为参数传入,当服务器端处理完毕执行回调之后,我们通过addMessage函数将信息打印到网页上,其实后面那段$(&#chatHistory&).show();完全可以放在addMessage这个方法里面去,因为它本来就是addMessage的一个过程。
//deal with chat mode.
$(&#entry&).keypress(function(e) {
var route = &chat.chatHandler.send&;
var target = $(&#usersList&).val();
if(e.keyCode != 13 /* Return */ )
var msg = $(&#entry&).attr(&value&).replace(&\n&, &&);
if(!util.isBlank(msg)) {
pomelo.request(route, {
content: msg,
from: username,
target: target
}, function(data) {
$(&#entry&).attr(&value&, &&); // clear the entry field.
if(target != '*' && target != username) {
addMessage(username, target, msg);
$(&#chatHistory&).show();
前端代码不处理任何逻辑,我们看下被远程rpc调用的chatHandler.js中的send方法是如何处理聊天消息的。
先通过session获得当前发送消息的用户的信息,然后调用channelService服务,获取频道对象,判断如果target是*,那就代表频道广播,直接channel.pushMessage将消息广播,触发前端client.js的onChat方法。
如果target是指定的uid,表示单播,我们先拼接目标用户id,然后根据我们之前保存的frontend的serverid拿到sid,最后我们通过pushMessageByUids将消息给指定的用户单播推送出去,注意这里不能使用channel对象而是使用channelService。
handler.send = function(msg, session, next) { var rid = session.get('rid'); var username = session.uid.split('*')[0]; var channelService = this.app.get('channelService'); var param = { route: 'onChat', msg: msg.content, from: username, target: msg.target }; channel = channelService.getChannel(rid, false); //the target is all users if(msg.target == '*') { channel.pushMessage(param); } //the target is specific user else { var tuid = msg.target + '*' + rid; var tsid = channel.getMember(tuid)['sid']; channelService.pushMessageByUids(param, [{ uid: tuid, sid: tsid }]); } next(null, { route: msg.route }); };
我们通过前端监听的onChat事件,将受到的消息放置在网页中,tip表示消息提醒功能。
pomelo.on('onChat', function(data) { addMessage(data.from, data.target, data.msg); $(&#chatHistory&).show(); if(data.from !== username) tip('message', data.from); });
这样我们整个的聊天室群聊和单聊 功能都已经开发完毕了,不过在看这些源码过程中还是碰到一些疑问的,可能需要去翻pomelo源码才能解决,总体感觉pomelo框架的文档不够详细,上 手教程也不够详细,很多api不知道怎么用法,估计真正投入生产还是要把pomelo框架的源代码翻个遍才能得心应手的使用。
看完聊天室的代码,给我几个有疑惑的地方,等接下来深入pomelo框架之后,应该会有所解答:
1、用户的session和channel信息的保存,默认应该是保存在内存中的,如何把它保存到中
2、session和channel的同步效率如何,目前还没测试过
3、对于connector或者chatserver的容灾问题,demo中也没考虑
4、gateserver理论上是可以支持分布式扩展的吧
5、如果connector和chat还有gate不在一台服务器上的话怎么处理?如何分别启动这些服务器和同步下发config?
相关热词搜索:
频道总排行
频道本月排行

我要回帖

更多关于 游戏服务器 gate 的文章

 

随机推荐