TCP协议下 Linux Server开发(1)-Reactor Proactor

首先说一下这一系列的blog主题

这主要是去年赶得一个项目,需求简单如下:类似于QQ,App输入消息(图片,语音,文字,视频),Server实现消息的转发,用户登录,用户心跳,离线消息,消息漫游,消息的断点续传。但是由于项目保密,所以具体业务实现我已经去掉,剩下的是一个Server的服务框架,也就是我最近想说的,如何下手写个Linux的Server。

TCP协议下 Linux Server开发(1)-Reactor Proactor_第1张图片

1.协议选取

Http协议在移动开发非常好用(在我的另外一个项目中,后台是SpringMVC中就使用了 http协议),但是这个项目是一个IM(及时通信)项目,http协议不如tcp适合,因为http协议不保留状态。

2.框架选取

C程序员都是喜欢“造轮子”的,所以框架不会像SpringMVC那么方便,很多都要重新写,而且看别人的复杂代码总是不友好(我是感觉Java编程很有堆积木的味道,而C则需要自己一点点积累)。但是框架还是需要选取的,现有的server框架主要有 reactor和proactor两种模式。
在理解这两个模式之前需要弄明白两个概念:阻塞/非阻塞 和 同步/异步

阻塞和非阻塞关注的是程序在等待调用结果的状态

  • 阻塞也就是代码会卡在这个地方,比如IO操作(所以Android的网络请求必须在worker thread中完成,因为会阻塞main/ui thread)
  • 非阻塞也就是使用了多线程之后的IO,代码将会继续执行,IO操作不再会阻塞。

同步和异步关注的是消息通信机制

  • 同步,你需要主动等待
  • 异步,消息到来时会有人给你通知

于是就有了 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞四种状态。
举个简单的例子,你要去参加面试,那你需要排队,同时你喜欢玩微博

  1. 同步阻塞,你排着队等面试,没有玩微博
  2. 同步非阻塞,你排着队,但是主要精力在玩微博
  3. 异步阻塞,你在家里等着电话告诉你面试,但是你很慌张,结果没有玩微博,一直等电话
  4. 异步非阻塞,你在家玩着微博等电话通知面试~

接下来说Reactor和Proactor。这两种是“事件驱动”的处理器,不同的事件通过在这里注册(这里主要是网络IO),来等待事件发生的通知。比如你对3306端口的socket需要处理,那么你首先要在 处理器注册,并写明你对此的操作。比如信息转发等具体业务逻辑。但是Reactor和Proactor的区别在哪里呢,我举个例子:
Proactor-事件处理器就是我们的邮局,我们注册了收“老王”的信的事件,所有邮局有信就告诉我们了,我们去邮局拿信,然后。。。,最后我们再把回信给邮局,邮局负责发出去。Proactor是异步非阻塞。
Reactor-我们还是要去邮局注册事件,邮局有信来了之后同时关门把信送到你手上,等你写完然后再寄出去.Reactor是同步阻塞。
(主要区别在同步还是异步)

那么为什么需要Reactor/Proactor呢?我们不需要“邮局”当然可以,但是我们的做法肯定是while(server_is_runing)死循环等待消息的到来,而且不能处理其他的IO时间(信号)。代码的效率差,而且不利于统一处理事件,代码的耦合性太强。

在Linux下为我们提供了poll、select和epoll系统调用完成,Linux的系统函数更适合实现Reactor模式的服务器,比如LibEvent,所以我们的接下来的代码将会是Reactor模式开发

有一定基础的直接看代码吧,感兴趣的慢慢追吧 ^_^

项目地址在这里,喜欢的加个星星~~

你可能感兴趣的:(Linux)