zoukankan      html  css  js  c++  java
  • 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,即可看到它们之间的交互和断开的过程。

     

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

    海阔凭鱼跃,天高任鸟飞 ,代码帮等你!!!
  • 相关阅读:
    Web server failed to start. Port 8080 was already in use.
    org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplic
    HttpClient测试框架
    Mock接口平台Moco学习
    自动化测试框架TestNG
    css常用记录...个人查看使用
    常用JS工具类 .....持续更新中 ...CV大法好
    element-upload覆盖默认行为(多个文件上传调用一次接口)
    基础术语理解
    MVC和MVVM设计模式简单理解
  • 原文地址:https://www.cnblogs.com/IT-LearnHall/p/9300419.html
Copyright © 2011-2022 走看看