基于消息的简单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.py
,message_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将结果返回给客户端,使长时间操作不会阻塞主线程。