websocket
websocket是web傳遞消息的一種協(xié)議寡痰。web傳遞消息的方式主要有輪詢(polling)忠聚、長(zhǎng)輪詢(long-polling)挠日、流(streaming)逮京、插件提供socket、websocket幾種方式嘱根。
websocket是html5的協(xié)議,握手協(xié)議跟http一樣巷懈,握手完成之后建立TCP鏈接该抒。
websocket建立的鏈接是持久,http的鏈接是非持久的。
http的生命周期通過Request來界定顶燕,也就是一個(gè)Request一個(gè)Response凑保,在HTTP1.0中冈爹,這次HTTP請(qǐng)求就結(jié)束了。
在HTTP1.1中進(jìn)行了改進(jìn)欧引,使得有一個(gè)keep-alive频伤,也就是說,在一個(gè)HTTP連接中芝此,可以發(fā)送多個(gè)Request憋肖,接收多個(gè)Response。但Response是被動(dòng)的婚苹,不能主動(dòng)發(fā)起岸更。
使用websocket需要服務(wù)端、客戶端膊升、代理同時(shí)支持怎炊。
socket.io
socket.io實(shí)現(xiàn)了polling和websocket兩種協(xié)議。如何使用廓译,github上有example:
-
服務(wù)端
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);
-
前端頁(yè)面需要引入socket.io.js,它是socketio生成的動(dòng)態(tài)js
<script src="/socket.io/socket.io.js"></script>
-
前端js
var socket = io(); socket.on('new message', function (data) { addChatMessage(data); });
運(yùn)行example评肆,監(jiān)聽網(wǎng)絡(luò),可以看到發(fā)了4個(gè)?EIO***的請(qǐng)求(不知道為什么會(huì)發(fā)4次非区,第一個(gè)請(qǐng)求是客戶端告訴服務(wù)端我支持websocket)糟港。polling和websocket方式都有:
polling和websocket最大的區(qū)別就是請(qǐng)求頭不一樣,websocket的請(qǐng)求頭如下所示:
把前端js代碼調(diào)整下院仿,設(shè)置socket.io的options秸抚,讓它只連接websocket:
var socket = io({transports: ["websocket"]})
設(shè)置之后,只有一個(gè)websocket的?EIO***連接歹垫。連接完成之后第一次發(fā)送的數(shù)據(jù)設(shè)置多久執(zhí)行一次心跳(ping-pong)剥汤。之后每隔一定時(shí)間data中都會(huì)多出兩條數(shù)據(jù)。
參考資料
socket.io源碼
HTTP的長(zhǎng)連接和短連接——Node上的測(cè)試
借助Nodejs探究WebSocket
Web 消息推送及 WebSocket 簡(jiǎn)介
WebSocket 是什么原理排惨?為什么可以實(shí)現(xiàn)持久連接吭敢?