python实现web详细过程

上传人:小** 文档编号:55644932 上传时间:2018-10-03 格式:DOC 页数:4 大小:36.50KB
返回 下载 相关 举报
python实现web详细过程_第1页
第1页 / 共4页
python实现web详细过程_第2页
第2页 / 共4页
python实现web详细过程_第3页
第3页 / 共4页
python实现web详细过程_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《python实现web详细过程》由会员分享,可在线阅读,更多相关《python实现web详细过程(4页珍藏版)》请在金锄头文库上搜索。

1、使用 Websocket 对于客户端来说无疑十分简单。websocket 提供了三个简单的函数,onopen,onclose 以及 onmessage,顾名思义,他们分别监听 socket 的开启、断开和消息状态。例如在一个 WebSocket 的客户端例子中,你可以这样写: Web Socket Example window.onload = function() var s = new WebSocket(“ws:/localhost:8000/”); s.onopen = function(e) alert(“opened”); s.onclose = function(e) alert

2、(“closed”); s.onmessage = function(e) alert(“got: ” + e.data); ; 在代码中,首先创建了一个新的 socket,指向 websocket 服务器端: var s = new WebSocket(“ws:/localhost:8000/”); 然后利用三个基本函数实现状态监听。 当然这个例子并不完善,它参考了麻省理工一位研究生 Mr. Yang 的文章(http:/yz.mit.edu/wp/web-sockets-tutorial-with-simple-python- server/),而你如果需要更好的客户端测试代码,可以看这里

3、:http:/cl.ly/3N3Y3t2s3U1v1h0A433u 我们在新的代码里提供了完成的和服务器交互数据的功能,发送数据我们使用的函数是 send(),你可以在代码中看到。 我们之所以不直接引用 Yang 的文章是因为 Yang 对服务器的理解不够完善,或者用他的话来说就是outdate。 感谢 Yang 为我们提供了一个简单的 socket server 的例子,不过可惜放在现在来说它是有问题的,当然我们还是把例子引述如下: #!/usr/bin/env python import socket, threading, time def handle(s): print repr(s

4、.recv(4096) s.send(” HTTP/1.1 101 Web Socket Protocol Handshaker Upgrade: WebSocketr Connection: Upgrader WebSocket-Origin: http:/localhost:8888r WebSocket-Location: ws:/localhost:9876/r WebSocket-Protocol: sample ”.strip() + rnrn) time.sleep(1) s.send(x00helloxff) time.sleep(1) s.send(x00worldxff)

5、s.close() s = socket.socket() s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(”, 9876); s.listen(1); while 1: t,_ = s.accept(); threading.Thread(target = handle, args = (t,).start() 虽然不符合我的风格,不过作为 python 代码来说依然是极具优美。 我们可以看到,Yang 在代码中首先创建了一个 socket,然后进行握手,此处的例子是: s.send(” HTTP/1.1 101

6、Web Socket Protocol Handshaker Upgrade: WebSocketr Connection: Upgrader WebSocket-Origin: http:/localhost:8888r WebSocket-Location: ws:/localhost:9876/r WebSocket-Protocol: sample ”.strip() + rnrn) 向客户端发送了这样一串字符串作为 data 的 head 信息以完成握手。当然如果你认真的去测试了 Yang 的例子,就会发现这样做是不规范的,或者说是不符合当前的 Websocket 协议的。 控制台会

7、反馈给你这样的信息: miss head: Sec-WebSocket-Local miss head: sec-WebSocket-Origin 这是因为,在第 76 和 77 版的 websocket 协议中,握手远非 Yang 所做的这般简单。 在 draft protocol 76 中,具体的握手要求如下 1.Client 应从 WebSocket-Origin 发送 head 包到 WebSocket-Location 2.客户端发送的包结构应该是包括 Host,Origin,Sec-WebSocket-Key1, Sec-WebSocket-Key2 等信息:这是我们截取的一个例子

8、: GET / HTTP/1.1rn Upgrade: WebSocketrn Connection: Upgradern Host: localhost:9876rn Origin: http:/127.0.0.1rn Sec-WebSocket-Key1: c 33w T5 1 1C72 66 I E=r 8rn Sec-WebSocket-Key2: 354214h9998 f rn 3.服务器断获取包后,应该提取总长度为 20 的 sec-websocket-key,然后进行如下计算: For each of these fields, the server has to take t

9、he digits from the value to obtain a number (in this case 1868545188 and 1733470270 respectively), then divide that number by the number of spaces characters in the value (in this case 12 and 10) to obtain a 32-bit number (155712099 and 173347027). These two resulting numbers are then used in the se

10、rver handshake, as described below. 既首先把以上字符串转化成数字,然后再计算 key 中的空格数目,并用 key 值除以空格数得到最后 key值。 4.发送包含以下信息的 head 给 client,完成握手,这里我直接贴出代码。 csock.send(“HTTP/1.1 101 WebSocket Protocol Handshakern”) csock.send(“Upgrade: WebSocketrn”) csock.send(“Connection: Upgradern”) csock.send(“Sec-WebSocket-Origin: htt

11、p:/”+origin+”rn”) csock.send(“Sec-WebSocket-Location: ws:/”+host+”:”+str(port)+”/rn”) csock.send(“Sec-WebSocket-Protocol: chatrn”) csock.send(“rn”) 5.在完成握手即可进行数据交互,特别注意的是数据发送应当以 0X00 开头以 0Xff 结尾: 因而建议最好采用一个诸如这样的函数 def send(data): first_byte = chr(000) payload = data.encode(utf-8) pl = first_byte + payload + chr(0xFF) csock.send(pl) 写到这里,已经实现了一个完整的 Websocket 服务器端了。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号