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

原创 2007年09月23日 22:13:00

  前面一直都在说接收数据时的处理方法,我们应该用专门的IO线程,接收到完整的消息包后加入到主线程的消息队列,但是主线程如何发送数据还没有探讨过。

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

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

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

Mangos源码分析(10):服务器公共组件实现之发包的方式

前面一直都在说接收数据时的处理方法,我们应该用专门的IO线程,接收到完整的消息包后加入到主线程的消息队列,但是主线程如何发送数据还没有探讨过。   一般来说最直接的方法就是逻辑线程什么时候想发数...
  • cgboss
  • cgboss
  • 2013年04月01日 19:01
  • 743

Mangos源码分析(10):服务器公共组件实现之发包的方式

前面一直都在说接收数据时的处理方法,我们应该用专门的IO线程,接收到完整的消息包后加入到主线程的消息队列,但是主线程如何发送数据还没有探讨过。   一般来说最直接的方法就是逻辑线程什么时候想发数...
  • jrg_2008
  • jrg_2008
  • 2015年11月01日 21:01
  • 182

Mangos源码分析(10):服务器公共组件实现之发包的方式

前面一直都在说接收数据时的处理方法,我们应该用专门的IO线程,接收到完整的消息包后加入到主线程的消息队列,但是主线程如何发送数据还没有探讨过。   一般来说最直接的方法就是逻辑线程什么时候想发数据了...
  • qq744886227
  • qq744886227
  • 2017年11月09日 16:06
  • 47

.Mangos源码分析(10):服务器公共组件实现之发包的方式

前面一直都在说接收数据时的处理方法,我们应该用专门的IO线程,接收到完整的消息包后加入到主线程的消息队列,但是主线程如何发送数据还没有探讨过。  一般来说最直接的方法就是逻辑线程什么时候想发数据了就直...
  • u011686361
  • u011686361
  • 2015年09月10日 15:21
  • 253

服务器发包方法解析

在当今这个网络互联时代,将服务提供到网络是很重要的一部分,这里就要讲解一下在服务器上发包的过程以及遇到相关问题的一些解决方法。 1  关闭服务 因为本地使用的是windows系统,可以使用"远程桌...
  • weew_pp
  • weew_pp
  • 2014年12月09日 10:32
  • 2225

服务器公共组件实现2

服务器公共组件 -- 事件与信号   关于这一节,这几天已经打了好几遍草稿,总觉得说不清楚,也不好组织这些内容,但是打铁要趁热,为避免热情消退,先整理一点东西放这,好继续下面的主题,以后如果有机...
  • robin2659
  • robin2659
  • 2014年08月20日 13:47
  • 249

服务器公共组件实现1

服务器公共组件实现 -- 环形缓冲区   消息队列锁调用太频繁的问题算是解决了,另一个让人有些苦恼的大概是这太多的内存分配和释放操作了。频繁的内存分配不但增加了系统开销,更使得内存碎片不断增多,...
  • robin2659
  • robin2659
  • 2014年08月20日 13:46
  • 183

面向服务体系架构和业务组件的思考

摘要:   在基于面向服务体系架构(SOA)中,“组件化”是一个很重要的概念,如何进行“组件化”开发是搭建企业级业务基础平台时需要考虑的一个重要课题,本文通过建立业务组件(BC)接口模型及内部结构模...
  • yangyangye
  • yangyangye
  • 2014年03月18日 19:42
  • 1775

如何上传发布自己的npm组件包

本文介绍如果上传自己写的 npm 组件包到 npm私库上。当你 写好了自己的一个npm的组件想共享上去给别人或者给公司的同事使用的时候,你可以把你的npm组件发布上去 (publish)。不过npm的...
  • cengjingcanghai123
  • cengjingcanghai123
  • 2015年03月13日 00:57
  • 6203

Linux服务器大量向外发包问题排查

最近Linux redhat 6.5 APP 业务系统,向外大量发送流量,不断建立tcp连接,目标地址是美国的一个IP, 估计被当成肉鸡了,比较悲惨,直接飞向IDC机房,防火墙显示这个APP服务器tc...
  • levy_cui
  • levy_cui
  • 2016年04月13日 14:04
  • 4150
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:服务器公共组件实现 -- 发包的方式
举报原因:
原因补充:

(最多只允许输入30个字)