基于消息的简单tcp服务器(python实现)

2020-08-12

来源

项目中需要一个压力不大的接收和发送各种指令的tcp服务器,我们自己的c++版本比较重,开发和使用起来不太方便,就想用python做一个简单io多路复用的版本,可以快速开发和迭代,上github找了一下,除gevent了也没找到比较简单的,想想还是自己用epoll写一个简单版本,可以更好进行控制。代码整体原理上参考了redis的处理流程,实现了基本功能。

项目地址在此

使用

使用一个新的server类继承message_server.py中的MessageServer,并且重新实现process和server_cron函数。process中处理各种message的情况并返回,server_cron可以执行一些服务器定期指令。具体实现可以参考task_server.py。

实现

项目分为3个文件,message.pymessage_server.py, task_server.py,他们的功能如下:

  • message.py 定义了服务器在传输中的数据包格式,以及实现对数据包打包和解包的函数

    Message struct is this { unsigned int sig, for len 0:4 unsigned int totlen, for len 4:8 unsigned int type, for len 8:12 char[] data for len 12:totlen }

  • message_server.py 是tcp服务器的主要代码,功能上使用epoll支持多个客户端同时连接,对每个客户端传来的数据使用message数据包格式解包,符合格式的调用process函数进行处理。在process函数中,根据解析出的message的type可以进行不同的处理。这里实现了一个简单的echo服务。另外支持服务端的一个定时事件,可以定时执行server_cron函数。

  • task_server.py 实现了一个更进一步的多线程处理服务端,继承了MessageServer并且重载了process和server_cron函数,可以支持将长时间操作的任务放入task线程中处理,等task处理完成后再通过server_cron将结果返回给客户端,使长时间操作不会阻塞主线程。