webSocket学习1
来源:互联网 发布:淘宝指数查询官网 编辑:程序博客网 时间:2024/05/21 22:36
websocket通信协议实现的是基于浏览器的原生socket,在客户端用JS即可轻松完成,前些天都在学习websocket 协议(但实际上websocket 协议甚为简约),并且粗略的思考过websocket的对于下一代web应用会产生怎样的影响,我想最大的巨变应该是就是实时性上吧!另外诸如上传大文件之类的优于http的应用。但问题也随之而来,服务端怎么办?前些天我弄了个websocket 聊天室的demo,现在还得在服务器上专门开个进程来跑呢,也许到时候不再是简单架设个web server就能跑应用的了。也许过不了多久,会出不同的服务端方案吧!先期待一下。
websocket的协议是很简单的,这里我把它分成客户端和服务端来讲。在客户端,new WebSocket即可实例化一个新的websocket对象,但其参数略微有一点不一样,参数格式是这样的ws://yourdomain:port/path ,这个从我的聊天室demo里面就可以轻松看出(ws = new WebSocket( “ws://www.zendstudio.net:9108/chat” ); ),WebSocket对象会自动解析这段字符串,发送到指定服务器端口,首先执行的是双方握手(handshake),客户端发送数据格式类似这样:
GET /chat HTTP/1.1Upgrade: websocketConnection: UpgradeHost: www.zendstudio.net:9108Origin: http://www.zendstudio.netSec-WebSocket-Key: U00QUfV1CRfIIU0NkcUCnA==Sec-WebSocket-Version: 13Sec-WebSocket-Extensions: x-webkit-deflate-frame
这很是有些类似于http的头信息,同样每行都是以”\r\n”结尾的,上面这段格式无需我们去构造,WebSocket对象会自动发送,对客户端这是透明的。此时服务端应该返回的信息是:
HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: 7GGzyIJjf9bX7pej+3tc5Vv87S0=WebSocket-Origin: http://www.zendstudio.netWebSocket-Location: ws://www.zendstudio.net:9108/chat
从这里我们太容易看出来,websocket协议的握手部分根本就是个类http的协议,所不同的是http每次都会有这样子的头信息交互,这在某些时候不得不显得很糟糕。而websocket只会执行一次这个过程,之后的传输信息就变得异常简洁了。
(2012.5.19新增内容)这里我们发现,version 13这个版本的websocket协议,与我之前文中叙述之最大不同就是多了一个验证,客户端会发送一个“Sec-WebSocket-Key”的base64编码的密钥,要求服务端必须返回一个“Sec-WebSocket-Accept”,否则客户端会抛出一个“Error during WebSocket handshake: Sec-WebSocket-Accept mismatch”错误之后,关闭连接,当然,这个Sec-WebSocket-Accept的值是计算出来的,胡乱的返回也是要遭到历史唾弃的。Sec-WebSocket-Accept的算法很简单:将客户端提交的Sec-WebSocket-Key+”258EAFA5-E914-47DA-95CA-C5AB0DC85B11″,然后sha1,然后base64_encode,以下列出我用nodejs写的代码片段:
sha1 = crypto.createHash('sha1');sha1.update(headers["Sec-WebSocket-Key"]+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11");ws_accept=sha1.digest('base64');
客户端在握手成功后,会触发WebSocket对象的onopen事件,告诉客户端连接已经成功建立了。客户端的WebSocket对象一共绑定了四个事件:1、onopen:连接建立时触发;2、onmessage:收到服务端消息时触发;3、onerror:连接出错时触发;4、onclose:连接关闭时触发;有了这4个事件,我们就可以很容易很轻松的驾驭websocket,并且需要说明的是websocket支持二进制数据的传输,因此,它远不止聊天室应用这么简单。
服务端呢?服务端也是非常简单的,但是仍然需要注意的问题是,作为服务器,安全和性能是不可忽略的,除此之外,只管往socket里面写数据就可以了,websocket的通信数据全部是以”\x00″开头以”\xFF”结尾的,无论是服务端发出的数据还是客户端发送的数据都遵从这个格式,唯一不同的是客户端的WebSocket对象能够自动将头尾去除,获得主体数据,这就省却了我们在客户端处理原始数据的必要,真是个体贴周到的对象啊!顺便说一句,WebSocket通信数据的编码总是UTF-8格式的。
服务端相对于草稿版还是改动很大的,从Sec-WebSocket-Extensions部分的声明来看,websocket是会支持压缩的,现在这个version 13版本已经不是当初的utf-8传字符的版本了,而是完全的二进制传输,服务端和客户端的通信经过了mask转换,这样就不太容易看出原文的内容了。这其中的算法颇有些复杂,并非一两句能够说的清楚,这里我写了两个函数来打包和解包数据:
- webSocket学习1
- websocket 学习 -
- websocket学习
- websocket学习
- websocket 学习
- Websocket(1)----初识websocket
- websocket-1
- websocket--1
- WebSocket学习总结(1)——Java后端WebSocket的Tomcat实现
- WebSocket学习(一)——webSocket简介
- websocket学习笔记
- Websocket学习--简易聊天室
- WebSocket 学习概要
- WebSocket for Ruby 学习
- websocket学习记录
- WebSocket学习笔记一
- tornado websocket 学习历程
- websocket协议学习
- 【LWJGL官方教程】Introduction 入门
- Problem E. Epic Win!
- Android控件之CheckBox多选框
- 两个ListView 嵌套数据出现错位,混淆的,图片闪烁问题
- android文件存储
- webSocket学习1
- JavaScript—————DOM
- Win32 API 选择文件和文件夹
- 求数组的子数组之和的最大值
- 生命诚可贵——致我最亲爱的学弟(罗云枫)
- android 实现button单击双击事件同时监控
- 高兴新面试题总结
- 《windows程序设计》选择文件
- BZOJ1083繁忙的都市