利用html5的websocket实现websocket聊天室


Posted in HTML / CSS onDecember 12, 2013

什么是websocket

 WebSocket 协议是html5引入的一种新的协议,其目的在于实现了浏览器与服务器全双工通信。看了上面链接的同学肯定对过去怎么低效率高消耗(轮询或comet)的做此事已经有所了解了,而在websocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。同时这么做有两个好处
 
1.通信传输字节减少:比起以前使用http传输数据,websocket传输的额外信息很少,据百度说只有2k
 
2.服务器可以主动向客户端推送消息,而不用客户端去查询
 
关于概念和好处,网上到处都是,不再赘述,简单看看其原理,然后动手写一个web版聊天室吧
 
握手

除了TCP连接的三次握手,websocket协议中客户端与服务器想建立连接需要一次额外的握手动作,在最新版的协议中是这个样子的
 
客户端向服务器发送请求
 

复制代码
代码如下:

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1:8080
Origin: <a href="http://test.com">http://test.com</a>
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: OtZtd55qBhJF2XLNDRgUMg==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36

服务器给出响应
 

复制代码
代码如下:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: xsOSgr30aKL2GNZKNHKmeT1qYjA=

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

经过握手之后浏览器与服务器建立连接,两者就可以互相通信了。websocket的API真心很简单,看看W3C的定义
 

复制代码
代码如下:

enum BinaryType { "blob", "arraybuffer" };
[Constructor(DOMString url, optional (DOMString or DOMString[]) protocols)]
interface WebSocket : EventTarget {
readonly attribute DOMString url;

// ready state
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSING = 2;
const unsigned short CLOSED = 3;
readonly attribute unsigned short readyState;
readonly attribute unsigned long bufferedAmount;

// networking
attribute EventHandler onopen;
attribute EventHandler onerror;
attribute EventHandler onclose;
readonly attribute DOMString extensions;
readonly attribute DOMString protocol;
void close([Clamp] optional unsigned short code, optional DOMString reason);

// messaging
attribute EventHandler onmessage;
attribute BinaryType binaryType;
void send(DOMString data);
void send(Blob data);
void send(ArrayBuffer data);
void send(ArrayBufferView data);
};


创建websocket
 
复制代码
代码如下:

ws=new WebSocket(address); //ws://127.0.0.1:8080

 
调用其构造函数,传入地址,就可以创建一个websocket了,值得注意的是地址协议得是ws/wss
 
关闭socket
复制代码
代码如下:

ws.close();

 
调用webservice实例的close()方法就可以关闭webservice,当然也可以传入一个code和string说明为什么关了
 
几个回调函数句柄
 
由于其异步执行,回调函数自然少不了,有四个重要的
 
onopen:连接创建后调用
onmessage:接收到服务器消息后调用
onerror:出错时调用
onclose:关闭连接的时候调用

看名字就知道是干什么的了,每个回调函数都会传入一个Event对象,可以通过event.data访问消息
 
使用API
 
我们可以在创建socket成功后为其回调函数赋值
 

复制代码
代码如下:

ws=new WebSocket(address);
ws.onopen=function(e){
var msg=document.createElement('div');
msg.style.color='#0f0';
msg.innerHTML="Server > connection open.";
msgContainer.appendChild(msg);
ws.send('{<'+document.getElementById('name').value+'>}');

 也可以通过事件绑定的方式
复制代码
代码如下:

ws=new WebSocket(address);
ws.addEventListener('open',function(e){
var msg=document.createElement('div');
msg.style.color='#0f0';
msg.innerHTML="Server > connection open.";
msgContainer.appendChild(msg);
ws.send('{<'+document.getElementById('name').value+'>}');

客户端实现
其实客户端的实现比较简单,除了websocket相关的几句就是一些自动focus、回车键事件处理、消息框自动定位到底部等简单功能,不一一说明了

HTML / CSS 相关文章推荐
CSS3+DIV实现漂亮的动画彩色标签
Jun 16 HTML / CSS
CSS3弹性盒模型开发笔记(一)
Apr 26 HTML / CSS
css3打造一款漂亮的卡哇伊按钮
Mar 20 HTML / CSS
基于Jquery和Css3代码制作可以缩放的搜索框
Nov 19 HTML / CSS
CSS3制作缩略图的详细过程
Jul 08 HTML / CSS
HTML5 Canvas的性能提高技巧经验分享
Jul 02 HTML / CSS
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
Jul 19 HTML / CSS
使用html5新特性轻松监听任何App自带返回键的示例
Mar 13 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
Aug 24 HTML / CSS
css如何把元素固定在容器底部的四种方式
Jun 16 HTML / CSS
使用CSS自定义属性实现骨架屏效果
Jun 21 HTML / CSS
详解CSS3浏览器兼容
Dec 24 HTML / CSS
html5拍照功能实现代码(htm5上传文件)
Dec 11 #HTML / CSS
html5教程实现Photoshop渐变色效果
Dec 04 #HTML / CSS
html5教程调用绘图api画简单的圆形代码分享
Dec 04 #HTML / CSS
html5教程画矩形代码分享
Dec 04 #HTML / CSS
html5教程制作简单画板代码分享
Dec 04 #HTML / CSS
html5 viewport使用方法示例详解
Dec 02 #HTML / CSS
html5实现的便签特效(实战分享)
Nov 29 #HTML / CSS
You might like
《APMServ 5.1.2》使用图解
2006/10/23 PHP
PHP开发入门教程之面向对象
2006/12/05 PHP
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
深入理解js中this的用法
2016/05/28 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
基于JavaScript实现的折半查找算法示例
2017/04/14 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
python抓取网页内容示例分享
2014/02/24 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
对python文件读写的缓冲行为详解
2019/02/13 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
为什么需要版本控制
2016/10/28 面试题
求职信的要素有哪些呢
2013/12/26 职场文书
冰淇淋店创业计划书范文
2013/12/27 职场文书
岗位职责的构建方法
2014/02/01 职场文书
坚定理想信念心得体会
2014/03/11 职场文书
计算机专业自荐信
2014/05/24 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
Go 中的空白标识符下划线
2022/03/25 Golang
Java实现简单小画板
2022/06/10 Java/Android