python3 tornado开发TCP服务程序,也是666

上一次利用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服务器就出来了。

本文来自企鹅号 - 老周开讲了媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏美码师

完美数据迁移-MongoDB Stream的应用

最近微服务架构火的不行,但本质上也只是风口上的一个热点词汇。 作为笔者的经验来说,想要应用一个新的架构需要带来的变革成本是非常高的。

33920
来自专栏Golang语言社区

golang websocket总结(问题贴)

因为工作的需要,接触了websocket,开始的一些很简单的代码,都不知道该怎样运行起来,所以,总是有一层神秘感,却没有太多的兴趣去研究它。不过,还是免不了要了...

43470
来自专栏Web行业观察

认识 WebAssembly

自从Brendan Eich用十天时间创造了JavaScript,人们对它的吐槽就从未间断过。众所周知JavaScript是一门动态语言。运行于JavaScri...

13740
来自专栏精讲JAVA

怎样编写高质量的Java代码

代码质量概述 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍...

456100
来自专栏一个爱吃西瓜的程序员

Python爬虫学习-抓取百度百科python词条页面的所有词条及其连接

这几天我学习爬虫有点过于激进,妄想一鼓作气地学会爬虫,结果随便踩进一个坑就跳不出来了。郁闷了一天,最终发现还是自己的基础太差,比如基础的函数、文件输出等都没有掌...

47140
来自专栏华章科技

Java 10新特性解密

请注意,本文中所包含的信息在写本文时是准确的。但是到发布时,JDK 10特性组预计将会增加。

9220
来自专栏运维技术迷

Redis单线程架构

redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务。 引出单线程模型 开启三个redis-cli客户端同时执行命令 客户端1设置一个字...

55380
来自专栏Golang语言社区

golang websocket总结(问题贴)

因为工作的需要,接触了websocket,开始的一些很简单的代码,都不知道该怎样运行起来,所以,总是有一层神秘感,却没有太多的兴趣去研究它。不过,还是免不了要了...

32030
来自专栏cloudskyme

linux内存查看方式

如下显示free是显示的当前内存的使用,-m的意思是M字节来显示内容.我们来一起看看. $ free -m total ...

57340
来自专栏枕边书

扩充你的工具箱 - 大行文件的处理

前言 前几天,从 DBA 手里接到一个 Redis RDB 文件,里面是 15G 约 660万 的 Redis 键值对数据,想通过这些数据提取出当前 Redis...

241100

扫码关注云+社区

领取腾讯云代金券