背景
关于tornado,我这里就不详细讲了,有兴趣的同学可以通过以下两篇博客了解一下:
http://yunjianfei.iteye.com/blog/2185476
http://yunjianfei.iteye.com/blog/2185446
我们一般用tornado来编写web程序,但实际上,tornado底层的代码非常优秀,也可以用这些代码来编写TCP应用。
github地址:https://github.com/yunjianfei/tornado-async-tcp
代码
tornado最突出的特点就是“异步”,所以,我这里编写了一个异步的TCPServer和一个异步的TCPClient来帮助大家理解,下面直接看代码:
文件:tcp_server.py
#!/usr/bin/env python2.7 # -*- coding: utf-8 -*- from tornado import ioloop, httpclient, gen from tornado.gen import Task from tornado.tcpserver import TCPServer import pdb, time, logging from tornado import stack_context from tornado.escape import native_str #Init logging def init_logging(): logger = logging.getLogger() logger.setLevel(logging.DEBUG) sh = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s -%(module)s:%(filename)s-L%(lineno)d-%(levelname)s: %(message)s') sh.setFormatter(formatter) logger.addHandler(sh) logging.info("Current log level is : %s", logging.getLevelName(logger.getEffectiveLevel())) class MyServer(TCPServer): def __init__(self, io_loop=None, **kwargs): TCPServer.__init__(self, io_loop=io_loop, **kwargs) def handle_stream(self, stream, address): TCPConnection(stream, address, io_loop=self.io_loop) class TCPConnection(object): def __init__(self, stream, address, io_loop): self.io_loop = io_loop self.stream = stream self.address = address self.address_family = stream.socket.family self.EOF = b' END' self._clear_request_state() self._message_callback = stack_context.wrap(self._on_message) self.stream.set_close_callback(self._on_connection_close) self.stream.read_until(self.EOF, self._message_callback) def _on_timeout(self): logging.info("Send message..") self.write("Hello client!" + self.EOF) def _on_message(self, data): try: timeout = 5 data = native_str(data.decode('latin1')) logging.info("Received: %s", data) self.io_loop.add_timeout(self.io_loop.time() + timeout, self._on_timeout) except Exception, ex: logging.error("Exception: %s", str(ex)) def _clear_request_state(self): """Clears the per-request state. """ self._write_callback = None self._close_callback = None def set_close_callback(self, callback): """Sets a callback that will be run when the connection is closed. """ self._close_callback = stack_context.wrap(callback) def _on_connection_close(self): if self._close_callback is not None: callback = self._close_callback self._close_callback = None callback() self._clear_request_state() def close(self): self.stream.close() # Remove this reference to self, which would otherwise cause a self._clear_request_state() def write(self, chunk, callback=None): """Writes a chunk of output to the stream.""" if not self.stream.closed(): self._write_callback = stack_context.wrap(callback) self.stream.write(chunk, self._on_write_complete) def _on_write_complete(self): if self._write_callback is not None: callback = self._write_callback self._write_callback = None callback() def main(): init_logging() server = MyServer() server.listen(8001) ioloop.IOLoop.instance().start() if __name__ == "__main__": try: main() except Exception, ex: print "Ocurred Exception: %s" % str(ex) quit()
文件: tcp_client.py
#!/usr/bin/env python2.7 # -*- coding: utf-8 -*- from tornado import ioloop, httpclient, gen from tornado.gen import Task import pdb, time, logging import tornado.ioloop import tornado.iostream import socket #Init logging def init_logging(): logger = logging.getLogger() logger.setLevel(logging.DEBUG) sh = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s -%(module)s:%(filename)s-L%(lineno)d-%(levelname)s: %(message)s') sh.setFormatter(formatter) logger.addHandler(sh) logging.info("Current log level is : %s", logging.getLevelName(logger.getEffectiveLevel())) class TCPClient(object): def __init__(self, host, port, io_loop=None): self.host = host self.port = port self.io_loop = io_loop self.shutdown = False self.stream = None self.sock_fd = None self.EOF = b' END' def get_stream(self): self.sock_fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) self.stream = tornado.iostream.IOStream(self.sock_fd) self.stream.set_close_callback(self.on_close) def connect(self): self.get_stream() self.stream.connect((self.host, self.port), self.send_message) def on_receive(self, data): logging.info("Received: %s", data) self.stream.close() def on_close(self): if self.shutdown: self.io_loop.stop() def send_message(self): logging.info("Send message....") self.stream.write(b"Hello Server!" + self.EOF) self.stream.read_until(self.EOF, self.on_receive) logging.info("After send....") def set_shutdown(self): self.shutdown = True def main(): init_logging() io_loop = tornado.ioloop.IOLoop.instance() c1 = TCPClient("127.0.0.1", 8001, io_loop) c2 = TCPClient("127.0.0.1", 8001, io_loop) c1.connect() c2.connect() c2.set_shutdown() logging.info("**********************start ioloop******************") io_loop.start() if __name__ == "__main__": try: main() except Exception, ex: print "Ocurred Exception: %s" % str(ex) quit()
分别运行tcp_server.py和tcp_client.py,通过测试结果,可以非常明显的了解到tornado的“异步”,以及强大的性能。
测试结果如下:
tcp_server:
2015-02-25 15:01:13,179 -server:server.py-L22-INFO: Current log level is : DEBUG
2015-02-25 15:01:18,146 -server:server.py-L56-INFO: Received: Hello Server! END
2015-02-25 15:01:18,146 -server:server.py-L56-INFO: Received: Hello Server! END
2015-02-25 15:01:23,146 -server:server.py-L49-INFO: Send message..
2015-02-25 15:01:23,147 -server:server.py-L49-INFO: Send message..
2015-02-25 15:01:18,146 -server:server.py-L56-INFO: Received: Hello Server! END
2015-02-25 15:01:18,146 -server:server.py-L56-INFO: Received: Hello Server! END
2015-02-25 15:01:23,146 -server:server.py-L49-INFO: Send message..
2015-02-25 15:01:23,147 -server:server.py-L49-INFO: Send message..
tcp_client:
2015-02-25 15:01:18,144 -client:client.py-L22-INFO: Current log level is : DEBUG
2015-02-25 15:01:18,145 -client:client.py-L77-INFO: **********************start ioloop******************
2015-02-25 15:01:18,145 -client:client.py-L56-INFO: Send message....
2015-02-25 15:01:18,145 -client:client.py-L59-INFO: After send....
2015-02-25 15:01:18,146 -client:client.py-L56-INFO: Send message....
2015-02-25 15:01:18,146 -client:client.py-L59-INFO: After send....
2015-02-25 15:01:23,147 -client:client.py-L48-INFO: Received: Hello client! END
2015-02-25 15:01:23,147 -client:client.py-L48-INFO: Received: Hello client! END
2015-02-25 15:01:18,145 -client:client.py-L77-INFO: **********************start ioloop******************
2015-02-25 15:01:18,145 -client:client.py-L56-INFO: Send message....
2015-02-25 15:01:18,145 -client:client.py-L59-INFO: After send....
2015-02-25 15:01:18,146 -client:client.py-L56-INFO: Send message....
2015-02-25 15:01:18,146 -client:client.py-L59-INFO: After send....
2015-02-25 15:01:23,147 -client:client.py-L48-INFO: Received: Hello client! END
2015-02-25 15:01:23,147 -client:client.py-L48-INFO: Received: Hello client! END
后续还有基于这个tcpserver的性能测试,请查看:
http://yunjianfei.iteye.com/blog/2187247
相关推荐
本教程将深入探讨如何利用Tornado构建异步TCP服务器和客户端,帮助你掌握这一核心技能。 首先,理解TCP(传输控制协议)是必要的。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,广泛应用于互联网上的...
基于tornado.netutil.TCPServer异步、超快、协议感知服务器。 扩展和提供自己的协议非常容易 例子 对于基于NewLiner协议中构建的低级回显服务器,请检查。 要启动服务器,请编写: from pserver . example import ...
总的来说,"tcp_server_honorus2_pythonTCP_tcp_tornado_pythonserver_"项目涵盖了使用Python和Tornado创建TCP服务器的全过程,包括TCP协议的基础、Tornado的异步特性和服务器框架的实现。通过学习这些内容,开发者...
tornado_apns, 在PyAPNS上,基于 Tornado的异步 APNS tornado_apns用于与苹果推送通知服务( APNs ) 进行 Tornado 异步编程的python 库示例用法import timefrom apns import APNs, Payloadfrom
总结起来,Python基于Tornado实现的系统核心调度,结合其异步特性和分布式扩展能力,能够构建出高性能、可扩展的网络服务。通过合理设计和利用Tornado提供的各种工具,开发者可以高效地解决并发处理、任务调度和...
基于python异步io框架Tornado,结合JavaScript的onkeydown事件、 jQuery的mousedown、mouseup、touchstart、touchend事件以及Ajax,实现了监控遥控命令与web网页指定按键和鼠标(屏幕)点击事件的绑定,同时也实现了...
trequests, python 请求的Tornado 异步 http/https客户端适配器 trequests 用于python请求的Tornado 异步 http/https客户端适配器。问题enjoy 使用来构建快速阻止网络应用程序,希望使用库中库,并希望使用库中库,...
拉拔器 用于从远程 HM 传感器中提取数据的工作程序。 为 Linux 设置 依赖设置 在 Pull 的根目录下,执行pip install -r requirements.txt 。 数据库设置 ...用于将 RabbitMQ 集成到 Tornado 参考:
**3.8 tornado.tcpserver — 基于 IOStream 的 TCP 服务器** `tornado.tcpserver` 模块提供了一个简单的 TCP 服务器实现,它可以使用 `IOStream` 来处理每个连接,非常适合构建实时通信服务。 #### 与其他服务的...
**Tornado-Redis:异步Python Redis连接器** 在Python编程中,Tornado是一个流行的异步网络库,常用于构建高性能、可扩展的网络应用。而Tornado-Redis是专门为Tornado设计的一个轻量级、高效的Redis客户端,它充分...
Python-msgsender是一个强大的工具,它基于著名的Tornado Web框架构建,设计用于实现异步消息发送功能。Tornado是一个开源的Python web框架和异步网络库,最初由FriendFeed开发,后来被Facebook收购并开源。其核心...
人工智能-项目实践-tornado-基于Tornado实现,系统核心调度,可分布式扩展 修改配置 对settings 里面的配置文件进行修改,主要是数据库 缓存 消息队列 修改 doc/nginx_ops.conf 的server_name 例如 改为 task....
Tornado Web框架是Python中的一个轻量级、高性能的异步网络库,适用于构建可处理大量并发连接的Web应用。Tornado以其非阻塞I/O模型和对WebSockets的良好支持而闻名,是构建实时Web服务的理想选择。 **RESTful API**...
Tornado是一个用Python编写的非阻塞式Web服务器和网络库,它支持WebSockets、HTTP服务器和客户端、异步TCP/UDP服务等。Tornado基于AsyncIO,确保了高效的并发处理能力。 2. **文件上传** 在Tornado中,文件上传...
总之,基于Tornado的CTF比赛平台设计是一个涵盖Web开发、网络安全知识、数据库管理和异步编程等多个领域的综合性项目,对于提升开发者的技术能力和团队协作能力有极大帮助。在实践中,开发者不仅能深入理解Tornado...
tornado.tcpserver是一个基于IOStream的TCP服务器,用于处理TCP连接。 Tornado还提供了与其它服务的集成,比如tornado.auth支持OpenID和OAuth的第三方登录。tornado.platform.asyncio是Tornado与asyncio之间的桥梁...
基于Tornado的开源CMS系统,TorCMS 是使用Python 3.5,Tornado Web框架, Peewee 开发的,数据库使用 PostgreSQL 9.4以上版本。使用MIT协议发布,目的是为了学习与交流,欢迎大家多提意见。 案例: ...
**基于Tornado框架的学术搜索引擎** 在现代互联网环境中,学术搜索是至关重要的工具,它帮助研究人员、学者和学生快速定位到相关的学术文献和资源。本文将深入探讨如何使用Python的Tornado Web框架构建一个高效的...
AsyncTorndb, 用于 Tornado的异步mysql客户端 AsyncTorndb ( 非活动)面向 Tornado的异步mysql客户端,基于 PyMySQL 。文档AsyncTorndb行为几乎与torndb行为相似,但异步。 请参考 torndb 并尝试。要求使用最新版本的...
该开源项目是一款基于Tornado和QTornado(本人独立开发的Tornado衍生版本)构建的通知器框架源码,包含254个文件,涵盖117个JavaScript文件、70个LESS样式文件、16个CSS文件、10个JPG图片文件、10个HTML文件、5个...