- 第1节:HTML5 浏览器支持
- 第2节:HTML5 新元素
- 第3节:HTML5 Canvas
- 第4节:HTML5 SVG
- 第5节:HTML5 MathML
- 第6节:HTML5 拖放
- 第7节:HTML5 地理定位
- 第8节:HTML5 视频(Video)
- 第9节:HTML5 音频(Audio)
- 第10节:HTML5 Input 类型
- 第11节:HTML5 表单元素
- 第12节:HTML5 表单属性
- 第13节:HTML5 语义元素
- 第14节:HTML5 Web 存储
- 第15节:HTML5 Web SQL
- 第16节:HTML5 应用程序缓存
- 第17节:HTML5 Web Workers
- 第18节:HTML5 SSE
- 第19节:HTML5 WebSocket
- 第20节:HTML5 代码规范
- 第21节:HTML5 <!DOCTYPE> 标签
- 第22节:HTML5 <a> 标签
- 第23节:HTML5 <area> 标签
- 第24节:HTML5 <abbr> 标签
- 第25节:HTML5 <applet> 标签
- 第26节:HTML5 <article>标签
- 第27节:HTML5 <aside> 标签
- 第28节:HTML5 <address> 标签
- 第29节:HTML <audio> 标签
- 第30节:HTML5 <b> 标签
- 第31节:HTML5 <base> 标签
- 第32节:HTML5 <blockquote> 标签
- 第33节:HTML5 <br />标签
- 第34节:HTML5 <button> 标签
- 第35节:HTML5 <bdi> 标签
- 第36节:HTML5 <bdo> 标签
- 第37节:HTML5 <body> 标签
- 第38节:HTML5 <canvas> 标签
- 第39节:HTML5 <col> 标签
- 第40节:HTML5 <colgroup> 标签
- 第41节:HTML5 <caption> 标签
- 第42节:HTML5 <em> <strong> <dfn> <code> <samp> <kbd> <var> <cite> 标签
- 第43节:HTML5 <ul> 标签
- 第44节:HTML5 <dl> 标签
- 第45节:HTML5 <del> 标签
- 第46节:HTML5 <dd> 标签
- 第47节:HTML5 <details> 标签
- 第48节:HTML5 <div> 标签
- 第49节:HTML5 <embed> 标签
- 第50节:HTML5 <figcaption> 标签
- 第51节:HTML5 <form> 标签
- 第52节:HTML5 <figure> 标签
- 第53节:HTML5 <footer> 标签
- 第54节:HTML5 <fieldset> 标签
- 第55节:HTML5 <hgroup> 标签
- 第56节:HTML5 <hr> 标签
- 第57节:HTML5 <h1> 至 <h6> 标签
- 第58节:HTML5 <header> 标签
- 第59节:HTML5 <html> 标签
- 第60节:HTML5 <head> 标签
- 第61节:HTML5 <i> 标签
- 第62节:HTML5 <iframe> 标签
- 第63节:HTML5 <input> 标签
- 第64节:HTML5 <img> 标签
- 第65节:HTML5 <ins> 标签
- 第66节:HTML5 <link> 标签
- 第67节:HTML5 <li> 标签
- 第68节:HTML5 <legend> 标签
- 第69节:HTML5 <label> 标签
- 第70节:HTML5 <map> 标签
- 第71节:HTML5 <meta> 标签
- 第72节:HTML5 <menu> 标签
- 第73节:HTML5 <meter> 标签
- 第74节:HTML5 <mark> 标签
- 第75节:HTML5 <nav> 标签
- 第76节:HTML5 <noscript> 标签
- 第77节:HTML5 <ol> 标签
- 第78节:HTML5 <object> 标签
- 第79节:HTML5 <option> 标签
- 第80节:HTML5 <output> 标签
- 第81节:HTML5 <optgroup> 标签
- 第82节:HTML5 <p> 标签
- 第83节:HTML5 <pre> 标签
- 第84节:HTML5 <param> 标签
- 第85节:HTML5 <progress> 标签
- 第86节:HTML5 <q> 标签
- 第87节:HTML5 <rp> 标签
- 第88节:HTML5 <rt> 标签
- 第89节:HTML5 <ruby> 标签
- 第90节:HTML5 <s> 标签
- 第91节:HTML5 <sub> 和 <sup> 标签
- 第92节:HTML5 <span> 标签
- 第93节:HTML5 <small> 标签
- 第94节:HTML5 <style> 标签
- 第95节:HTML5 <strike> 标签
- 第96节:HTML5 <select> 标签
- 第97节:HTML5 <source> 标签
- 第98节:HTML5 <section> 标签
- 第99节:HTML5 <summary> 标签
- 第100节:HTML5 <td> 标签
- 第101节:HTML5 <th> 标签
- 第102节:HTML5 <tt> 标签
- 第103节:HTML5 <tr> 标签
- 第104节:HTML5 <table> 标签
- 第105节:HTML5 <title> 标签
- 第106节:HTML5 <tfoot> 标签
- 第107节:HTML5 <thead> 标签
- 第108节:HTML5 <time> 标签
- 第109节:HTML5 <tbody> 标签
- 第110节:HTML5 <textarea> 标签
HTML5 WebSocket
HTML5 WebSocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。
当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。
以下 API 用于创建 WebSocket 对象。
var Socket = new WebSocket(url, [protocal] );
以上代码中的第一个参数 url, 指定连接的 URL。第二个参数 protocol 是可选的,指定了可接受的子协议。
WebSocket 属性
以下是 WebSocket 对象的属性。假定我们使用了以上代码创建了 Socket 对象:
WebSocket 事件
以下是 WebSocket 对象的相关事件。假定我们使用了以上代码创建了 Socket 对象:
WebSocket 方法
以下是 WebSocket 对象的相关方法。假定我们使用了以上代码创建了 Socket 对象:
WebSocket 实例
WebSocket 协议本质上是一个基于 TCP 的协议。
为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息"Upgrade: WebSocket"表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。
客户端的 HTML 和 JavaScript
目前大部分浏览器支持 WebSocket() 接口,你可以在以下浏览器中尝试实例: Chrome, Mozilla, Opera 和 Safari。
test_websocket.html 文件内容
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>test教程(test.cn)</title>
<script type="text/javascript">
function WebSocketTest()
{
if ("WebSocket" in window)
{
alert("您的浏览器支持 WebSocket!");
// 打开一个 web socket
var ws = new WebSocket("ws://localhost:9998/echo");
ws.onopen = function()
{
// Web Socket 已连接上,使用 send() 方法发送数据
ws.send("发送数据");
alert("数据发送中...");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
alert("数据已接收...");
};
ws.onclose = function()
{
// 关闭 websocket
alert("连接已关闭...");
};
}
else
{
// 浏览器不支持 WebSocket
alert("您的浏览器不支持 WebSocket!");
}
}
</script>
</head>
<body>
<div>
<a href="javascript:WebSocketTest()">运行 WebSocket</a>
</div>
</body>
</html>
安装 pywebsocket
在执行以上程序前,我们需要创建一个支持 WebSocket 的服务。从 pywebsocket 下载 mod_pywebsocket ,或者使用 git 命令下载:
git clone https://github.com/google/pywebsocket.git
mod_pywebsocket 需要 python 环境支持
mod_pywebsocket 是一个 Apache HTTP 的 Web Socket扩展,安装步骤如下:解压下载的文件。
进入 pywebsocket 目录。
执行命令:
$ python setup.py build $ sudo python setup.py install
查看文档说明:
$ pydoc mod_pywebsocket
开启服务
在 pywebsocket/mod_pywebsocket 目录下执行以下命令:
$ sudo python standalone.py -p 9998 -w ../example/
以上命令会开启一个端口号为 9998 的服务,使用 -w 来设置处理程序 echo_wsh.py 所在的目录。
现在我们可以在 Chrome 浏览器打开前面创建的 test_websocket.html 文件。如果你的浏览器支持 WebSocket(), 点击"运行 WebSocket",你就可以看到整个流程各个步骤弹出的窗口,流程 Gif 演示:
在我们停止服务后,会弹出 "连接已关闭..."。
总之,使用WebSocket技术,后台可以随时向前端推送消息,以此保证前后台状态统一,这在传统的无状态HTTP协议中无法做到。