利用 Python 自带的 TCPServer 编写 TCP 接收服务器
Python3.6+ 自带了 TCPServer 以便于更快编写 TCP 服务器,同时 Python 也提供了多线程的 Mixin 以提供多线程支持。
由于每个 TCPServer 只能服务于一个 TCP 连接,而 Python 的多线程 Mixin 并不限制最大连接数,所以可能会导致线程过度增长。
本文介绍一种简单的自制线程池方法的 Python TCP 服务器。
代码
settings.py
BUF_SIZE = 1024
SERVER_PORT = 8973
THREAD_WORKERS_NUM = 10
server.py
from socketserver import BaseRequestHandler, TCPServer
from threading import Thread
import settings
import logging
# 自定义的日志
logging.basicConfig(
level=logging.INFO,
format='[%(levelname)s] %(asctime)s %(filename)s: %(message)s',
datefmt='%Y-%m-%d %A %H:%M:%S',
filename='socket.log',
filemode='a',
)
class ReceiveHandler(BaseRequestHandler):
def setup(self):
logging.info("Connect from: " + str(self.client_address))
def handle(self):
try:
while True:
msg = self.request.recv(settings.BUF_SIZE)
if msg:
# 接收处理
pass
else:
break
except Exception as e:
logging.warning('Exception is: ' + str(e))
def finish(self):
logging.info("Disconnect from: " + str(self.client_address))
if __name__ == '__main__':
try:
logging.info("Start Server !")
socket_serve = TCPServer(('', settings.SERVER_PORT), ReceiveHandler)
for i in range(settings.THREAD_WORKERS_NUM):
t = Thread(target=socket_serve.serve_forever)
t.daemon = True
t.start()
socket_serve.serve_forever()
except KeyboardInterrupt:
socket_serve.shutdown()
logging.info("Stop Server !")