基于websocket和Python的在线聊天室

作者: admin 分类: 学习文档 发布时间: 2011-11-13 00:06

一、什么是WebSocket API

     WebSocket API是下一代客户端-服务器的异步通信方法。该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的客户端和服务器程序。WebSocket目前由W3C进行标准化。WebSocket已经受到Firefox 4、Chrome 4、Opera 10.70以及Safari 5等浏览器的支持。

     WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。

二、WebSocket协议
     websocket的协议是很简单的,这里我把它分成客户端和服务端来讲。在客户端,new WebSocket即可实例化一个新的websocket对象,但其参数略微有一点不一样,参数格式是这样的ws://yourdomain:port/path ,WebSocket对象会自动解析这段字符串,发送到指定服务器端口,首先执行的是双方握手(handshake),客户端发送数据格式类似这样:
GET /chat HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: www.zendstudio.net:9108
Origin: http://www.zendstudio.net
Cookie: somenterCookie
 
 这很是有些类似于http的头信息,同样每行都是以”rn”结尾的,上面这段格式无需我们去构造,WebSocket对象会自动发送,对客户端这是透明的。此时服务端应该返回的信息是:
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://www.zendstudio.net
WebSocket-Location: ws://www.zendstudio.net:9108/chat
从这里我们太容易看出来,websocket协议的握手部分根本就是个类http的协议,所不同的是http每次都会有这样子的头信息交互,这在某些时候不得不显得很糟糕。而websocket只会执行一次这个过程,之后的传输信息就变得异常简洁了。
握手协议:request中有三个随机的key值,头部有两个,后面body里是长度为8字节的key3(括号里的文字是提示,还有字符间的冒号也是为了看上去清晰才加上的,真正传输是没有的),以此向server发送一个challenge,server需要根据这三个key计算出一个token,在响应中发回给client,以证明自己对request的正常解读。计算方法是这样的:对于key1,抽取其中的数字字符,形成一个整数num,然后除以他自身的空格数spaces,保留整数部分i1; key2如法炮制,得到i2,把i1和i2按照big-endian字符序连接起来,然后再与key3连接,得到一个初始的序列,对这个序列使用md5计算出一个16字节长的摘要,就是所需的token。另外值得注意的是Origin头部,意味着Websocket是支持cross origin的。
 
 
三、在线聊天室代码(客户端)
 
移步至:http://www.oschina.net/code/snippet_176897_5938
 
四、在线聊天室代码(python 服务器端)

移步至:http://www.oschina.net/code/snippet_176897_5937

运行效果:
http://hi.baidu.com/guodong828/blog/item/341883cae942c390c91768c3.html
  (2)http://www.cnblogs.com/wei2yi/archive/2011/03/23/1992830.html
  (3)http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html
  (4)http://tomsheep.net/abc-of-websocket/

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Protected by WP Anti Spam
更多阅读
标签云