服务器公共组件实现 -- 发包的方式
来源:互联网 发布:天刀真武捏脸数据下载 编辑:程序博客网 时间:2024/05/21 07:58
前面一直都在说接收数据时的处理方法,我们应该用专门的IO线程,接收到完整的消息包后加入到主线程的消息队列,但是主线程如何发送数据还没有探讨过。
一般来说最直接的方法就是逻辑线程什么时候想发数据了就直接调用相关的socket API发送,这要求服务器的玩家对象中保存其连接的socket句柄。但是直接send调用有时候有会存在一些问题,比如遇到系统的发送缓冲区满而阻塞住的情况,或者只发送了一部分数据的情况也时有发生。我们可以将要发送的数据先缓存一下,这样遇到未发送完的,在逻辑线程的下一次处理时可以接着再发送。
考虑数据缓存的话,那这里这可以有两种实现方式了,一是为每个玩家准备一个缓冲区,另外就是只有一个全局的缓冲区,要发送的数据加入到全局缓冲区的时候同时要指明这个数据是发到哪个socket的。如果使用全局缓冲区的话,那我们可以再进一步,使用一个独立的线程来处理数据发送,类似于逻辑线程对数据的处理方式,这个独立发送线程也维护一个消息队列,逻辑线程要发数据时也只是把数据加入到这个队列中,发送线程循环取包来执行send调用,这时的阻塞也就不会对逻辑线程有任何影响了。
采用第二种方式还可以附带一个优化方案。一般对于广播消息而言,发送给周围玩家的数据都是完全相同的,我们如果采用给每个玩家一个缓冲队列的方式,这个数据包将需要拷贝多份,而采用一个全局发送队列时,我们只需要把这个消息入队一次,同时指明该消息包是要发送给哪些socket的即可。有关该优化的说明在云风描述其连接服务器实现的blog文章中也有讲到,有兴趣的可以去阅读一下。
- 服务器公共组件实现 -- 发包的方式
- 服务器公共组件实现 -- 发包的方式
- Mangos源码分析(10):服务器公共组件实现之发包的方式
- .Mangos源码分析(10):服务器公共组件实现之发包的方式
- Mangos源码分析(10):服务器公共组件实现之发包的方式
- Mangos源码分析(10):服务器公共组件实现之发包的方式
- 服务器公共组件实现 -- 状态机
- 服务器公共组件实现 -- 状态机
- 服务器公共组件实现1
- 服务器公共组件实现2
- 服务器公共组件实现 -- mangos的游戏主循环
- 服务器公共组件实现 -- mangos的游戏主循环
- 服务器公共组件实现 -- 消息队列
- 服务器公共组件实现 -- 环形缓冲区
- 服务器公共组件实现 -- 消息队列
- 服务器公共组件实现 -- 环形缓冲区
- php实现攻击服务器的自动执行发包源码
- 服务器公共组件实现 -- 继续来说主循环
- HTML5 教程(三) - 块级元素
- HTML 5 教程(二) - 结构
- memcpy()详解
- SqlHelper类
- iOS 的多核编程
- 服务器公共组件实现 -- 发包的方式
- 一个linux程序分析讲解(入门级)
- Ubuntu安装配置MySQL
- 内存屏障(memory barrier)
- 服务器公共组件实现 -- 状态机
- 如何在SSH断开后让远程服务器程序继续运行
- orcale 中varchar2 和nvarchar2的区别
- GridView嵌套DropDownList联动问题
- 线程----BlockingQueue (转)