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异步接入支付宝支 ...
随机推荐
- SQL Server换版本卸载问题
好久没更博客了,今天随性的更一篇.. 你是否也在问这个问题. 给你答案: 1.运行:输入regedit 进入注册表编辑器,进入之后执行下列操作: 2.在注册表,删除如下项:HKEY_CURRENT_U ...
- django-orm框架表单的增删改查
08.14自我总结 django-orm框架 一.orm基本配置 1.创建django项目 命令行:cmd先去到django创建目录,然后输入django-admin startproject dja ...
- VMware15.5版本下安装Windows_Server_2008_R2
一.新建虚拟机 第一步:打开VMware15.5虚拟机,在欢迎界面点击新建虚拟机: 第二步:选择典型(推荐)选项-->适用于新手,单击下一步: 第三步:选定最后一项稍后安装操作系统,单击下一步: ...
- Ubuntu Qt5.13 无法输入中文和中文显示乱码问题
无法输入中文: sudo apt-get install libfcitx-qt5-dev cd /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminput ...
- STL的vector略解
本文部分内容参考于这儿. vector 的基础知识,上文已经阐述地很详尽了.笔者谨给出 vector 的声明及其常用函数. 代码抬头需包含 #include<vector> using n ...
- libevent::事件
/***************************************************************** 函数功能: 创建事件集 ********************* ...
- 自学php有哪些好的方法
很多php新手对于如何自学php很苦恼,找不到入门到方法,有些时候一个软件都下载不下来,后者环境都不能安装好,大大打击了学习的信心.那么如何能自学好php,学好php有哪些方法呢,接下来我就给同学们提 ...
- 基于 HTML5 + Canvas 实现楼宇自控系统
前言 楼宇自控是指楼宇中电力设备,如电梯.水泵.风机.空调等,其主要工作性质是强电驱动.通常这些设备是开放性的工作状态,也就是说没有形成一个闭环回路.只要接通电源,设备就在工作,至于工作状态.进程.能 ...
- java中多线程 - 多线程中的基本方法
介绍一下线程中基本的方法使用 线程睡眠sleep() Thread.sleep(毫秒);我们可以通过sleep方法设置让线程睡眠.可以看到sleep是个静态方法 public static nativ ...
- javascript运行时中的堆栈和队列
下面是一个理论上的模型,js引擎着重实现和优化了描述的这几个语义 可视化描述 栈(stack) var a = 10; function bar(x) { var b = 5; fn(x + b); ...