本篇是我个人对单个TCP服务器开发的理解。网络模型基于Libevent,如果大家觉得有什么不妥的地方,欢迎指正,促使我提高,谢谢大家!
先上图:
说明:
1.Libevent用于网络控制,包括客户端的连接与断开,网络数据的接收与发送。
2.客户端连接之后,生成一个对应的客户端对象,并交给客户端管理对象去管理。
3.Libevent数据缓存池默认只有4K的大小,而客户端一个数据包很可能不仅仅4K,所以收到的数据,先拷贝到客户端自己保存。
4.客户端在收到完整的数据包后,将消息形成对应消息子类对象(MsgBase是消息基类),然后把消息对象加入到消息队列(生产者)。
5.开辟一个线程,只做把消息队列里的消息分发给线程池里面的线程(消费者)。
6.线程池里的线程这时候要处理具体的消息,这里有些消息可能耗时严重,利用这种处理方式,可以实现先来的消息先处理,但是先处理的消息如果耗时严重,却不会成为后来消息的延时点。
7.消息处理后,就通过Libevent把结果转发出去。
这个图里面还有好多没有详细说明,主要是一些异常处理和共享资源的问题:
1.如果消息队列中有某个客户端的消息还没处理,那么此时客户端却异常断开连接了。
2.消息队列存在多个线程共同操作的问题。
3.没有做分包发送的详细说明
(后续持续更新,欢迎大家斧正!)