上一次利用tornado开发了一个http API服务程序,在centos7.4 64位 2C/4G的服务器上进行了一次,很轻松的rps就到10000每秒,利用pyenv安装pypy后,再次测试能达到17000每秒,C10K不再是一个问题。
突发奇想,看看tornado开发TCP服务器怎样,至于TCPServer的源码可以自己阅读,同样采用了异步的设计架构,速度也是很快(开发快,运行速度也快)
先放代码上来:
class MyServer(TCPServer):
def __init__(self, io_loop=None, **kwargs):
TCPServer.__init__(self, io_loop=io_loop, **kwargs)
@gen.coroutine
def handle_stream(self, stream, address):
print('New Client',address)
while True:
try:
data_h = yield stream.read_bytes(1)
if data_h == b'xFE':
data = yield stream.read_until(b'xFE')
print(data)
msg = yield self.do_data(data)
yield stream.write(msg)
except StreamClosedError:
logging.warning("Lost client at host %s", address[0])
break
except Exception as e:
print(e)
设计了一个16进制的传输数据包,每帧数据头尾设定为固定标记
@gen.coroutine
def do_data(self,data):
data=bytearray(data)
if data[0]==0x1:
msg='Hello'
elif data[0]==0x2:
msg='你好'
else:
msg='Hi'
data=bytearray(msg.encode())
data.insert(0,0xfe)
data.append(0xfe)
return data
def main():
server = MyServer()
server.bind(8013, '127.0.0.1', backlog=65535, reuse_port=True)
server.start(0) #多进程模式
在windows环境下,部分特性不支持,需要修改如下:
server.bind(8013, '127.0.0.1', backlog=65535, reuse_port=False)
server.start()
ioloop.IOLoop.instance().start()
是不是看着很简单,tornado已经将tcpserver封装好了,只需要重载handle_stream,根据自己的业务需求,稍作改动,已经个简单的TCP服务器就出来了。