websocket
websocket是web传递消息的一种协议。web传递消息的方式主要有轮询(polling)、长轮询(long-polling)、流(streaming)、插件提供socket、websocket几种方式。
websocket是html5的协议,握手协议跟http一样,握手完成之后建立TCP链接。
websocket建立的链接是持久,http的链接是非持久的。
http的生命周期通过Request来界定,也就是一个Request一个Response,在HTTP1.0中,这次HTTP请求就结束了。
在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但Response是被动的,不能主动发起。
使用websocket需要服务端、客户端、代理同时支持。
socket.io
socket.io实现了polling和websocket两种协议。如何使用,github上有example:
-
服务端
var server = require('http').createServer(); var io = require('socket.io')(server); io.on('connection', function(socket){ socket.on('event', function(data){}); socket.on('disconnect', function(){}); }); server.listen(3000);
-
前端页面需要引入socket.io.js,它是socketio生成的动态js
<script src="/socket.io/socket.io.js"></script>
-
前端js
var socket = io(); socket.on('new message', function (data) { addChatMessage(data); });
运行example,监听网络,可以看到发了4个?EIO***的请求(不知道为什么会发4次,第一个请求是客户端告诉服务端我支持websocket)。polling和websocket方式都有:
polling和websocket最大的区别就是请求头不一样,websocket的请求头如下所示:
把前端js代码调整下,设置socket.io的options,让它只连接websocket:
var socket = io({transports: ["websocket"]})
设置之后,只有一个websocket的?EIO***连接。连接完成之后第一次发送的数据设置多久执行一次心跳(ping-pong)。之后每隔一定时间data中都会多出两条数据。
参考资料
socket.io源码
HTTP的长连接和短连接——Node上的测试
借助Nodejs探究WebSocket
Web 消息推送及 WebSocket 简介
WebSocket 是什么原理?为什么可以实现持久连接?