博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
服务器设计笔记(4)-----客户端通信模块
阅读量:5978 次
发布时间:2019-06-20

本文共 684 字,大约阅读时间需要 2 分钟。

   整个底层通信模块修改过很多次,因为首次使用epoll,在其中遇见了很多问题,最终设计成下面的方式:

   

   1: 对于epoll中EPOLLOUT事件的使用,因为频繁的调用send()函数,系统会在内核模式和用户模式之间切换太多消耗太大,所以最终启用了定时器模式,比如以50ms为间隔,定时的遍历所有的ClientPlayer 去发送 OutStream 里面的数据。

   2: 最开始使用玩家的id 对应每个玩家的ClientPlayer的,在玩家没有进入的时候 使用玩家的账号名; 后来增加了一个map,用玩家id去映射对应的socket,在用socket 去映射对应的Clientplayer。

   3:   对于epoll中的EPOLLOUT事件,因为启用的是边缘模式,所以在连接刚建立的时候会触发这个事件,但是如果在之后再想通过这个时间的触发去发送数据就不可能了。所以尽量还是不要使用EPOLLOUT事件去做发送处理。

   4: 每个连接都有自己的缓存,当缓存慢的时候就做异常处理,将这个客户端断开。

   5: 最先设计的时候,是做成了多进程,后来修改成了单进程多线程模式。可能疑问单进程会不会影响在线,本来场景内的玩家确实要处理走动逻辑,后来考虑到这是一个模拟经营类游戏,玩家可能不关系走动逻辑的一致性,所以就去掉了服务器走动逻辑的处理,交给了客户端处理。没有这个压力,服务器压力小很多。 

   6: 消息的接受和发送做在了一个线程里,不同类型的消息的处理坐在了不同的线程里。两者通过上篇讲到的消息队列进行通信。

   7: 所有的底层API函数包括epoll相关,socket相关都做了一封装。

转载地址:http://sepox.baihongyu.com/

你可能感兴趣的文章
深入理解JavaScript系列(47):对象创建模式(上篇)
查看>>
Install Wise制作软件安装包
查看>>
xml学习笔记与心得
查看>>
Asp.net MVC23 使用Areas功能的常见错误
查看>>
在Word中生成随机的样本文本
查看>>
Android之创建自定义属性
查看>>
SCP不需要密码
查看>>
iOS学习系列 - MonoTouch绑定原生Obj-C静态库的实现
查看>>
koogra--Excel文件读取利器
查看>>
广播通信
查看>>
绑定到异步的ObservableCollection
查看>>
使用beetle简单地实现高效的http基础服务
查看>>
坚果云开发团队分享高效代码审查经验
查看>>
光棍节程序员闯关秀 segmentfault 网站的一个游戏
查看>>
不考虑线程安全的初级单例C++代码
查看>>
java this的使用(翻译自Java Tutorials)
查看>>
Python类型和对象
查看>>
C/C++运算符“优先级”与“结合性”的区别
查看>>
C#安全调用线程的步骤
查看>>
Scrum项目如何获得管理层的支持和合作
查看>>