首页 | 新闻资讯 | 考试认证 | Windows | Linux | Vista | UNIX/BSD | 黑客技术 | 平面设计 | 网页制作 | 网站建设 | 服务器 Web | FTP | SQL | 网络协议 | 交换技术 | 路由技术 | 网络组建 | 无线技术 | 求职招聘 | 病毒播报 | ERP | 网站推广 | 网站优化 | 建站心得 | 建站教程 | 论坛 |
华夏网管站-凝聚网管力量
热门关键字: 系统安装盘  emcorp  vxcbx  怎么布线
首页 Web服务器 FTP服务器 SQL服务器 ISA服务器 Exchange 域服务器 游戏服务器 其他
您现在的位置: |主页>服务器>游戏服务器>正文

服务器公共组件实现 -- 发包的方式

文章来源互联网 作者华夏网管站整理 更新时间2008-07-08 推荐给好友推荐给好友 收藏本页收藏本站 文章投稿
前面一直都在说接收数据时的处理方法,我们应该用专门的IO线程,接收到完整的消息包后加入到主线程的消息队列,但是主线程如何发送数据还没有探讨过。

  网管论坛bbs.ofAdmin.Com

  一般来说最直接的方法就是逻辑线程什么时候想发数据了就直接调用相关的socket API发送,这要求服务器的玩家对象中保存其连接的socket句柄。但是直接send调用有时候有会存在一些问题,比如遇到系统的发送缓冲区满而阻塞住的情况,或者只发送了一部分数据的情况也时有发生。我们可以将要发送的数据先缓存一下,这样遇到未发送完的,在逻辑线程的下一次处理时可以接着再发送。 IT技术网Www.ofAdmin.Com

  考虑数据缓存的话,那这里这可以有两种实现方式了,一是为每个玩家准备一个缓冲区,另外就是只有一个全局的缓冲区,要发送的数据加入到全局缓冲区的时候同时要指明这个数据是发到哪个socket的。如果使用全局缓冲区的话,那我们可以再进一步,使用一个独立的线程来处理数据发送,类似于逻辑线程对数据的处理方式,这个独立发送线程也维护一个消息队列,逻辑线程要发数据时也只是把数据加入到这个队列中,发送线程循环取包来执行send调用,这时的阻塞也就不会对逻辑线程有任何影响了。 华夏网管Www.ofAdmin.Com

  采用第二种方式还可以附带一个优化方案。一般对于广播消息而言,发送给周围玩家的数据都是完全相同的,我们如果采用给每个玩家一个缓冲队列的方式,这个数据包将需要拷贝多份,而采用一个全局发送队列时,我们只需要把这个消息入队一次,同时指明该消息包是要发送给哪些socket的即可。有关该优化的说明在云风描述其连接服务器实现的blog文章中也有讲到,有兴趣的可以去阅读一下。

Tags: 责任编辑:方子龙

上一篇:服务器公共组件实现 -- 环形缓冲区
下一篇:没有了

 热点关注

 ·自己如何来搭建CS游戏服务器
 ·服务器公共组件实现 -- 发包的方式
 ·服务器结构探讨 -- 一点杂谈
 ·游戏服务器技术交流
 ·服务器结构探讨 -- 继续世界服
 ·服务器公共组件实现 -- mangos的游戏
 ·服务器公共组件实现 -- 消息队列
 ·服务器公共组件实现 -- 继续来说主循
 ·服务器公共组件实现 -- 环形缓冲区
 ·服务器结构探讨 -- 简单的世界服实现
 今日更新
 24小时热门信息