不要在windows下开发Tornado程序。
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 头的值,返回给客户端。