Python实现基于tornado的异步TCPServer和TCPClient即时通信小程序代码

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( 8036 )
    server.start()
    ioloop.IOLoop.current().start()

解说:

创建一个继承于 TCPServer 的类的实例,监听端口,启动服务器,启动消息循环,服务器开始运行。

这时,如果有 client 连接过来,Tornado 会创建一个 iostream,然后调用handle_stream 方法,调用时传入的两个参数是 iostream 和 client 的地址。我们示例的功能很简单,每收到一段 20 字符以内的内容,将之反序回传,如果收到 'over‘,就断开连接。

注意,断开连接不用 yield 调用;无论是谁断开连接,连接双方都会各自触发一个 StreamClosedError。

tcp_client端,( 键盘输入)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( 'localhost', 8036 )
    try:
        while True:
            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端,输入值结果如下:

tcp_server.py端:

tcp_client.py端:

温馨提示:使用该小程序前,得下载安装tornado==4.5.1,命令pip  install tornado==4.5.1 ,用该命令前你得安装好pip。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值