客户端发包 GS端接收
客户端发包,GS接收
bool GameServer::ProcessLoop(packet& rPkt)//GS线程做的
{
if(false == m_spDataLayer->Recv(rPkt))
return true;//没数据了 if(rPkt.is_data)
{
if(!rPkt.data)//数据为空
return false; GameChannel* pGC = m_vecChannel[rPkt.channel_id];//m_vecChannelGS里面所有玩家的通道,通过channelid唯一标识
if(pGC)
pGC->OnReceiveData(rPkt.data, rPkt.size); m_LiveMgr.OnLive(rPkt.channel_id);
}
}
//还是第一次看到这种覆盖的用法,BaseChannel::OnReceiveData直接调用父类的函数
//现在感觉这样写比较好,子类可以处理自己的逻辑,不然都放到BaseChannel::OnReceiveData,耦合度变大了
//gs2ms_转client_cmd从GS发送到MS命令,在GS和MS之间定义的协议属于内部协议,如果发平行关系就太多了,
//通过内部定义的几个协议,然后再MS里面在分,感觉这样清晰很多
//关于哪个包发到哪一层,一般发到GS这边的和地图没关系,或者是跨地图的操作,不然都会讲这个包发到MS里面,其实这个我有点模糊,回头再详看
bool GameChannel::OnReceiveData(void* pData, int nLen)
{
if(!BaseChannel::OnReceiveData(pData, nLen))
{
if(m_eGameState != eGameState_EnterMap)//没有进入地图
return false;
m_pMap->Gs2MsData(gs2ms_转client_cmd, m_nChannelId, pData, nLen);//gs2ms_转client_cmd,难道这个消息到MS里面就一定会转到客户端吗?不一定吧
}
return true;
} bool BaseChannel::OnReceiveData(void* data, int len)
{
Protocol Ptl = {};
if(!Ptl.from_buffer(data, len))
{
return false;
}
auto it = m_mapPktAnalysis.find(Ptl.cmd_type);
if(it == m_mapPktAnalysis.end())//m_mapPktAnalysis是在new GameChannel的时候就已经绑定好了
{
//[]测试
//m_map->onCmd(data, len);
return false;//表示不是GS这一层的包,是map server里面的包
}
return it->second(Ptl.content, Ptl.size);//调用相应的绑定函数 // return true;
} void Map::Gs2MsData(int cmd, int channel_id, void* data, int len)
{
MapPkt pkt;
pkt.channelId = channel_id;
pkt.data = m_memPool.popPkt(len);//因为不同线程,需要分配一块内存,用于保存包数据
memcpy(pkt.data, data, len);
pkt.len = len;
pkt.cmd = cmd; PushPkt(pkt);
}
客户端发包 GS端接收的更多相关文章
- .net remoting 客户端与服务端绑定事件,一部电脑当服务器,另一部当客户端,发布后没法接收远程错误信息。
可以是用下面代码抛出远程错误,客户端和服务端都要设置,因为服务端事件回调时角色变成了远程客户端了. RemotingConfiguration.CustomErrorsMode = CustomErr ...
- TCP学习之五:客户端、服务端异步传输字符串
参考学习张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html 消息发送接口: 消息接收接口: 客户端: 服务端: 消息发送类: ...
- [Java]Hessian客户端和服务端代码例子
简要说明:这是一个比较简单的hessian客户端和服务端,主要实现从客户端发送指定的数据量到服务端,然后服务端在将接收到的数据原封不动返回到客户端.设计该hessian客户端和服务端的初衷是为了做一个 ...
- 用PHP的socket实现客户端到服务端的通信
服务端 <?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //本地IP $address = 'loca ...
- C# TCP实现多个客户端与服务端 数据 与 文件的传输
C#菜鸟做这个东东竟然花了快三天的时间了,真是菜,菜,菜--- 下面是我用C#写的 一个简单的TCP通信,主要的功能有: (1) 多个客户端与服务器间的数据交流 (2)可以实现群发的功能 (3)客户端 ...
- Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- Java实现TCP之Echo客户端和服务端
Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- Android客户端与服务端交互之登陆示例
Android客户端与服务端交互之登陆示例 今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的 1.后台 ...
- socket 通信 入门3 android 客户端 C# 服务端
这是一个android端操控服务器的例子 就是发送简单指令到服务器 然后服务器响应什么的... 当然这里是未完成的 只是简单展示一下大致思路 首先连接建立起来后 服务端给客户端一条信息 告诉 ...
随机推荐
- 重拾C,一天一点点_11
命令行参数 在支持C语言的环境中,可以在程序开始执行时将命令行参数传递给程序. 调用主函数main时,它带有两个参数,第一个参数(argc,用于参数计数)的值表示运行程序时命令行参数的数目:第二个参数 ...
- 【转】CSS white-space 属性
定义和用法 white-space 属性设置如何处理元素内的空白. 这个属性声明建立布局过程中如何处理元素中的空白符.值 pre-wrap 和 pre-line 是 CSS 2.1 中新增的. 默认值 ...
- scala学习资料
强烈推荐一个s在线学习scala的网站: http://zh.scala-tour.com/#/overview
- python SocketServer 源码分析
附上原文链接: http://beginman.cn/python/2015/04/06/python-SocketServer/
- (1)c语言学习总结之从关键字到循环结构
一.关键字和标示符 1.关键字:c规定的有特殊含义的单词(也就是系统起的名字),全部是小写,有32个; 由关键字引出数据类型和流程类型 1.分类: (1)数据类型:整型用int标示,字符型用char表 ...
- .NET开源工作流RoadFlow-流程设计-流转条件设置(路由)
当一个步骤后面有多个步骤时,可以设置为根据设置条件系统自动判断该流向哪些步骤,也叫路由. roadflow没有单独的路由步骤来设置条件,流程条件通过双击连线弹出条件设置框来设置. 1.sql条件 即通 ...
- 关于ios极光推送server端注意的地方
今天试用了极光推送API 用它是因为,大多数人说它的文档是最全的,但是用过之后,发现关于IOS的文档,还是很不够,导致走了一点弯路! 特别是服务端的代码:https://github.com/jpus ...
- Qt的进度条设置
progress bar 颜色设置 QProgressBar { border: 2px solid grey; border-radius: 5px; background-color: ...
- C Primer Plus学习笔记
1.汇编语言是特地的Cpu设计所采用的一组内部指令的助记符,不同的Cpu类型使用不同的Cpu C给予你更多的自由,也让你承担更多的风险 自由的代价是永远的警惕 2.目标代码文件.可执行文件和库 3.可 ...
- CommonsChunkPlugin的使用(关于angular2中的polyfills和vendor的疑问解决)
seed: angular2-webpack-starter(在github上可以找到) polyfills:提供api以方便兼容不同的浏览器 vendor:项目插件扩展 在学习ng2中一直不明白为什 ...