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 条评论
登录 后参与评论

相关文章

来自专栏Vamei实验室

Python应用02 Python服务器进化

**注意,在Python 3.x中,BaseHTTPServer, SimpleHTTPServer, CGIHTTPServer整合到http.server包...

2006
来自专栏向治洪

android开发性能分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾。不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结、我一总结的都说到了很多优化注意事项...

2175
来自专栏编程

小白爬虫之爬虫快跑

使用多线程时好像在目录切换的问题上存在问题,可以给线程加个锁试试 Hello 大家好!我又来了。 你是不是发现下载图片速度特别慢、难以忍受啊!对于这种问题一般解...

1828
来自专栏潇涧技术专栏

Art of Android Development Reading Notes 13

《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

832
来自专栏听雨堂

【5】基于Log4Net的日志系统

阅读目录 日志系统应具备的特性 Log4Net 配置文件:log4net.config 初始化 输出信息 对Log4Net的封装 log4net.c...

2136
来自专栏GreenLeaves

JavaScrtip之JS最佳实践

一、JavaScript之平稳退化 这边使用一个当用户点击某个页面内某个链接弹出一个新窗口的案例: JavaScript使用window对象的open()方法来...

2015
来自专栏杨建荣的学习笔记

由hugepage设置导致的数据库事故(r4笔记第28天)

近期客户需要希望提高业务处理能力,在现有的系统中加入几台weblogic服务器,所以需要增加以下连接数的配置,但是同时他们想对现有系统的设置一些变更,发送了一个...

2884
来自专栏皮振伟的专栏

[linux][memory]使用procrank分析内存利用及分析源代码

前言: procrank是一个统计内存使用的神器,包括VSS,PSS,PSS和USS的详细参数。作为一个内存使用的分析工具,简直厉害的不要不要的。 作者尝试过几...

3547
来自专栏AhDung

【C#】给无窗口的进程发送消息

一个winform程序,我希望它不能多开(但是如何防多开不是本文要讲的),那么在用户启动第二个实例的时候,作为第二个实例来说,大概可以有这么几种做法:

1063
来自专栏程序猿DD

Jedis常见异常汇总

本文作者:carlosfu 原文链接:https://yq.aliyun.com/articles/236384 摘要: Jedis虽然使用起来比较简单,但是如...

1.3K9

扫码关注云+社区