云服务器

人生苦短我用python[0x0C] 小试tornado(websocket)

2017-12-26 16:43:47 0

tornado简介

python不仅可以用来做系统或者业务层面的开发,还可以做跟web相关的项目,目前有3个比较广泛流行的python开源web框架,有web.py、tornado、django。web.py http://webpy.org/ 它相对于其他两个框架来讲比较精简上手也比较快,当然了精简的另外一方面就是功能比较简单。tornado http://www.tornadoweb.org/ 网上流传作者的灵感来自于web.py,tornado跟其他框架相比,经常说的一个特性就是非阻塞服务。最后一个常见的django我们会在另外的文章单独再介绍,个人感觉django https://www.djangoproject.com/ 貌似更适合用来做web的前后端融合开发,但django使用起来个人觉得相对比较复杂,需要理解的概念东西比较多,tornado则相对来讲比较适合做web的后端服务,而且使用起来也简单。

tornado使用案例

什么时候我们会用到python的web框架呢?在回答这个问题之前我们先了解一下现状,我们知道当前有2个很成熟,稳定,而且使用面也很广的开源web服务端,apache和nginx,他们都能内嵌或者支持php,lua等动态扩展,可以很好地完成大部分项目对web的需求功能。apache,nginx这些web服务端,它们擅长的地方都是提供http、https或者代理服务,如果请求的连接需要后台长期运行的比如websocket服务,用起来就不太好使。现在微信的小程序都很流行,在微信的小程序里面只有2种网络通信方式可以用,一种是普通的http请求回复型的断连接,一种是支持长连接的websocket,假如需要使用小程序来实现一个长连接的功能,那么websocket则是不二之选。 下面我们通过一个websocket服务器聊天室作为例子,演示tornado框架的简单使用。

先安装tornado

apt install python-tornado

编辑main.py文件内容如下:

from tornado import websocket, web, ioloop

#cl记录的是当前websocket连接
cl = []

class SocketHandler(websocket.WebSocketHandler):
    def check_origin(self, origin):
        return True

    def open(self):
        if self not in cl:
            cl.append(self)#添加一个新连接进来的websocket连接

    def on_close(self):
        if self in cl:
            cl.remove(self)#当websocket连接断开了删除连接信息

class ApiHandler(web.RequestHandler):

    @web.asynchronous
    def get(self, *args):
        self.finish()
        msg = self.get_argument("msg")#获取消息推送接口提交过来的消息
        for c in cl:
            c.write_message(msg)#给当前所有websocket连接发送消息

app = web.Application([
    (r'/ws', SocketHandler),#这里提供websocket服务的入口类
    (r'/api', ApiHandler),  #这里是提供普通http消息推送的接口类
])

if __name__ == '__main__':
    app.listen(8388)
ioloop.IOLoop.instance().start()#开始死循环地处理IO

运行main.py文件

python main.py

我们再使用一个在线的websocket测试工具http://www.websocket.org/echo.html 连接到我们的websocket服务器,记得我们使用的是普通的websocket(ws),所以务必访问http的地址,如果访问了https默认是用wss(SSL的websocket访问是不行的),如下截图所示:

一起正常的话,会提示CONNECTED代表连接websocket服务器成功,这个时候我们调用api接口发送一个消息

curl http://x.x.x.x:8388/api?msg=hello

我们可以看到websocket测试工具连接的websocket成功地收到我们发送的消息。

 

上一篇: 无

微信关注

获取更多技术咨询