Tornado


不要在windows下开发Tornado程序。

Tornado_第1张图片
image.png

class URL(websocket.WebSocketHandler):
    def open(self):
        print("WebSocket opened")
        
    def check_origin(self, origin):  
        return True  
    
    def on_message(self, message):
        print("url is: ",message)
        self.write_message(u"郑老板,您好,我已经收到url:" + message)

    def on_close(self):
        print("WebSocket closed")

url_receiving = tornado.web.Application([
    (r"/url", URL),
])
if __name__ == "__main__":
    url_receiving.listen(10000)
    tornado.ioloop.IOLoop.instance().start()

  • BUG1.
    Ipython的话tornado.ioloop.IOLoop.instance().start()会报错。

  • BUG2.
def check_origin(self, origin):  
        return True  

如果不写的话出于安全的考虑(cookie检测)会出错。

后台:
PS D:\CodeHouse\tornado\websocket> python .\ws_app.py
WARNING:tornado.access:403 GET /ws (::1) 1.00ms
WARNING:tornado.access:403 GET /ws (::1) 1.00ms

前台:
WebSocket connection to 'ws://localhost:8080/ws' failed: Error during WebSocket handshake: Unexpected response code: 403 

为什么要玩Tornado?

因为浏览器端要用websocket不用socket了。

  • 以前,很多网站使用轮询实现推送技术。轮询是在特定的的时间间隔(比如1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给浏览器。轮询的缺点很明显,浏览器需要不断的向服务器发出请求,然而HTTP请求的header是非常长 的,而实际传输的数据可能很小,这就造成了带宽和服务器资源的浪费。
    Comet使用了AJAX改进了轮询,可以实现双向通信。但是Comet依然需要发出请求,而且在Comet中,普遍采用了长链接,这也会大量消耗服务器带宽和资源。
    于是,WebSocket协议应运而生。
  • WebSocket协议
    浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器通过 TCP 连接直接交换数据。WebSocket 连接本质上是一个 TCP 连接。
    WebSocket在数据传输的稳定性和数据传输量的大小方面,具有很大的性能优势。

注:WebSocket具有很大的性能优势,流量和负载增大的情况下,优势更加明显。


具体的例子:

浏览器请求

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: null
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13

服务器回应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Origin: null
Sec-WebSocket-Location: ws://example.com/

在请求中的Sec-WebSocket-Key是随机的,服务器端会用这些数据来构造出一个SHA-1的信息摘要。把Sec-WebSocket-Key加上一个魔幻字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11。使用 SHA-1 加密,之后进行 BASE-64编码,将结果作为 Sec-WebSocket-Accept 头的值,返回给客户端。

你可能感兴趣的:(Tornado)