Tornado 异步socketTCP通信
Tornado 有 TCPClient 和 TCPServer 两个类,可用于实现 tcp 的客户端和服务端。事实上,这两个类都是对iostream的简单包装。
真正重要的是 iostream
iostream 是 client 与 server 之间的 tcp 通道。被动等待创建 iostream 的一方是 server,主动找对方创建 iostream 的一方是 client。
在 iostream 创建之后,client 与 server 的操作再无分别,在任何时候都可以通过 iostream.write 向对方传送内容,或者通过 iostream.read_xx(这是一组以 read_ 开头的方法,有:read_bytes 读取指定长度;read_until 读取直到特定字符;read_until_regex 读取直到特定正则表达式;read_until_close 读取直到连接关闭)接收对方传来的内容,或者以 iostream.close 关闭连接。
TCPServer
下边是示例代码中的 tcp_server.py
# -*- coding: utf-8 -*-
#!/usr/bin/env python
# @Time : 2018/5/15 17:34
# @Desc :
# @File : tcp_server.py
# @Software: PyCharm
from tornado import ioloop, gen, iostream
from tornado.tcpserver import TCPServer
class MyTcpServer( TCPServer ):
@gen.coroutine
def handle_stream( self, stream, address ):
try:
while True:
msg = yield stream.read_bytes( 20, partial = True )
print msg, 'from', address
stream.write(str(msg))
yield stream.write( msg[::-1] )
if msg == 'over':
stream.close()
except iostream.StreamClosedError:
pass
if __name__ == '__main__':
server = MyTcpServer()
server.listen(8888)
server.start()
ioloop.IOLoop.current().start()
解说:
创建一个继承于 TCPServer 的类的实例,监听端口,启动服务器,启动消息循环,服务器开始运行。
这时,如果有 client 连接过来,Tornado 会创建一个 iostream,然后调用handle_stream 方法,调用时传入的两个参数是 iostream 和 client 的地址。我们示例的功能很简单,每收到一段 20 字符以内的内容,将之反序回传,如果收到 'over‘,就断开连接。
注意,断开连接不用 yield 调用;无论是谁断开连接,连接双方都会各自触发一个 StreamClosedError。
TCPClient
下边是示例代码中的 tcp_client.py
# -*- coding: utf-8 -*-
#!/usr/bin/env python
# @Time : 2018/5/15 17:38
# @Desc :
# @File : tcp_client.py
# @Software: PyCharm
from tornado import ioloop, gen, iostream
from tornado.tcpclient import TCPClient
@gen.coroutine
def Trans():
stream = yield TCPClient().connect( '127.0.0.1',8888 )
try:
while True:
print TCPClient
DATA = raw_input("Enter your input: ");
yield stream.write( str(DATA) )
back = yield stream.read_bytes( 20, partial = True )
msg = yield stream.read_bytes(20, partial=True)
print msg
print back
if DATA=='over':
break
except iostream.StreamClosedError:
pass
if __name__ == '__main__':
ioloop.IOLoop.current().run_sync( Trans )
解说:
使用 TCPClient 比 TCPServer 更简单,无须继承,只要用 connect 方法连接到 server,就会返回 iostream 对象了。
在本例中,我们向 server 发送一些字符串,它都会反序发回来。最后发个 'over',让 server 断开连接。
当然也可以由 client 断开;值得注意,这段代码与之前的几个例子有个根本的区别,之前都是服务器,被动等待行为发生,而这段代码是一运行就主动发起行为(连接),因此它的运行方式不同于以往,需要我们主动通过 ioloop 的 run_sync 来调用。
以往那些实例中的异步处理方法实际是由 Tornado 调用的。在 run_sync 里,tornado 会先启动消息循环,执行目标函数,之后再结束消息循环。
演示
在第一个终端窗口运行 tcp_server.py,在第二个终端窗口运行 tcp_client.py,即可看到它们之间的交互和断开的过程。



注意:最好输入英文字符串测试。

Tornado 异步socketTCP通信的更多相关文章
- 5.(基础)tornado异步
终于到了传说中的异步了,感觉异步这个名字听起来就很酷酷的,以前还不是多擅长Python时,就跑去看twisted的源码,结果给我幼小的心灵留下了创伤.反正包括我在内,都知道异步编程很强大,但是却很少在 ...
- JAVA基础知识之网络编程——-基于AIO的异步Socket通信
异步IO 下面摘子李刚的<疯狂JAVA讲义> 按照POSIX标准来划分IO,分为同步IO和异步IO.对于IO操作分为两步,1)程序发出IO请求. 2)完成实际的IO操作. 阻塞IO和非阻塞 ...
- tornado异步请求的理解(转)
tornado异步请求的理解 http://www.kankanews.com/ICkengine/archives/88953.shtml 官网第一段话: Tornado is a Python w ...
- 异步tcp通信——APM.Server 消息推送服务的实现
消息推送服务 服务器推送目前流行就是私信.发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的:高性能.分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用 ...
- 异步tcp通信——APM.ConsoleDemo
APM测试 俗话说麻雀虽小,五脏俱全.apm虽然简单,但是可以实现单机高性能消息推送(可以采用redis.kafka等改造成大型分布式消息推送服务器). 测试demo: using System; u ...
- 异步tcp通信——APM.Core 服务端概述
为什么使用异步 异步线程是由线程池负责管理,而多线程,我们可以自己控制,当然在多线程中我们也可以使用线程池.就拿网络扒虫而言,如果使用异步模式去实现,它使用线程池进行管理.异步操作执行时,会将操作丢给 ...
- 异步tcp通信——APM.Core 解包
TCP通信解包 虽说这是一个老生长谈的问题,不过网上基本很少见完整业务:或多或少都没有写完或者存在bug.接收到的数据包可以简单分成:小包.大包.跨包三种情况,根据这三种情况作相对应的拆包处理,示例如 ...
- c#之异步Socket通信
0.基于上一篇的c#之Socket(同步)通信,在几个大神评论之后,发现是有挺多地方不足的,所以写了一个改进版本的基于c#的异步Socket通信.再加深一下对Socket的使用和理解.其中客户端和服务 ...
- 使用Tornado异步接入第三方(支付宝)支付
目前国内比较流行的第三方支付主要有支付宝和微信支付,博主最近研究了下如何用Python接入支付宝支付,这里我以Tornado作为web框架,接入支付宝构造支付接口. 使用Tornado异步接入支付宝支 ...
随机推荐
- asp.net开源流程引擎API开发调用接口大全-工作流引擎设计
关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 一.程序调用开发接口二. 接口说明 所谓的驰骋工作流引擎的接口,在B ...
- 从零开始的vue学习笔记(七)
前言 今天花一天时间阅读完vuex的官方文档,简单的做一下总结和记录 Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,以前的符合"单向数据流"理念的 ...
- cogs2550. 冰桥,升起来了!
[问题背景] 11月16日: 今天要来到南极洲的一角来考察啦!南极的空气真的很好呢,只不过有点冷,雪什么的真是太可爱了!这次我要在一个冰谷(应该说是山谷的地方)考察,考察点在这山谷的两边(希望不要掉下 ...
- 子网掩码!如何划分子网掩码,计算IP地址
作者:chli1806 一.子网掩码的含义和根据子网掩码划分子网一个IP地址必然属于某一个网络,或者叫子网.子网掩码就是用来指定某个IP地址的网络地址的,换一句话说,就是用来划分子网的.例如,一个A类 ...
- Mysql综述(1)数据是如何读存的
引言 我们都知道,mysql中的索引,事务,锁等都是作为开发人员要重点掌握的知识面,但要想掌握理解好这些知识却并非易事. 其中原因之一就是这些概念都过于抽象,事实上如果都不懂mysql数据是以一种怎样 ...
- eclipse常用快捷键即项目操作
快捷键: 1.代码提示:Alt+/ 2.撤销上一步操作:Ctrl+z:取消撤销:Ctrl+y: 3.如何注销一整段代码?☞▲第一种注释方法是每行代码前加//:先选中,然后按Ctrl+/:取消注销方法一 ...
- Spring Security 入门(一)
当你看到这篇文章时,我猜你肯定是碰到令人苦恼的问题了,我希望本文能让你有所收获. 本人几个月前还是 Spring 小白,几个月走来,看了 Spring,Spring boot,到这次的 Spring ...
- Ubuntu 安装中文
系统环境:
- 利用python模拟菜刀反弹shell绕过限制
有的时候我们在获取到目标电脑时候如果对方电脑又python 编译环境时可以利用python 反弹shell 主要用到python os库和sokect库 这里的服务端在目标机上运行 from sock ...
- 移动端真机调试--weinre
一.安装 首先确保你的电脑上有node环境,然后使用cnpm或npm 安装 windows下 npm install weinre -g --registry=https://registry.npm ...