• 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,即可看到它们之间的交互和断开的过程。

     

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

    海阔凭鱼跃,天高任鸟飞 ,代码帮等你!!!
  • 相关阅读:
    PNG文件格式具体解释
    opencv2对读书笔记——使用均值漂移算法查找物体
    Jackson的Json转换
    Java实现 蓝桥杯VIP 算法训练 装箱问题
    Java实现 蓝桥杯VIP 算法训练 装箱问题
    Java实现 蓝桥杯VIP 算法训练 单词接龙
    Java实现 蓝桥杯VIP 算法训练 单词接龙
    Java实现 蓝桥杯VIP 算法训练 方格取数
    Java实现 蓝桥杯VIP 算法训练 方格取数
    Java实现 蓝桥杯VIP 算法训练 单词接龙
  • 原文地址:https://www.cnblogs.com/IT-LearnHall/p/9300419.html
Copyright © 2020-2023  润新知