WebSocket是HTML5開始提供的一種瀏覽器與服務器間進行全雙工通信的網絡技術。html
現不少網站爲了實現即時通信,所用的技術都是輪詢(polling)。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務器發出HTTP請求,而後由服務器返回最新的數據給客服端的瀏覽器,這種方式有一個很大的弊端,就是會佔用不少的帶寬。node
最新的輪詢效果是Comet – 用了AJAX。但這種技術雖然可達到全雙工通訊,但依然須要發出請求。web
使用WebSocket,瀏覽器和服務器只須要要作一個握手的動做,而後,瀏覽器和服務器之間就造成了一條快速通道,二者之間就直接能夠數據互相傳送。並且它爲咱們實現即時服務帶來了兩大好處:express
實現了websocket的瀏覽器:npm
Socket.IO是一個WebSocket庫,包括了客戶端的js和服務器端的nodejs,它的目標是構建能夠在不一樣瀏覽器和移動設備上使用的實時應用。瀏覽器
socket.io的特色服務器
socket.io支持跨平臺,在不一樣平臺下,它的使用方法也是大同小異,下面咱們就來安裝使用它websocket
首先要下載安裝node環境,而後經過npm安裝socket.io網絡
npm install socket.io
socket.io的服務端啓動很是的簡單,引用socket.io模塊。app
var io = require('socket.io');
而後調用listen函數,傳入監聽的端口號,開始服務監聽。練習環境中啓用了80端口用於測試,在練習時只須要監聽80端口便可:
var io = require('socket.io')(80);
咱們學習瞭如何啓動簡單的socket服務,下面來學習一下如何爲服務端註冊一些經常使用的事件:
var io = require('socket.io')(80); io.on('connection',function(socket){ //鏈接成功... socket.on('disconnect',function(){ //用戶已經離開... }) })
connection事件在客戶端成功鏈接到服務端時觸發,有了這個事件,咱們能夠隨時掌握用戶鏈接到服務端的信息。
當客戶端成功創建鏈接時,在connection事件的回調函數中,咱們仍是能夠爲socket註冊一些經常使用的事件,如:disconnect事件,它在客戶端鏈接斷開是觸發,這時候我就知道用戶已經離開了。
目前爲止,咱們已經搭建好了一個最簡單的socket服務器,爲了在瀏覽器中可以訪問到咱們的服務,咱們還須要在服務端搭建一個簡單的web服務器,讓瀏覽器可以訪問咱們的客戶端頁面。
爲了便捷,咱們選用node.js中經常使用的express框架來實現web服務,示例以下:
var express = require('express'); var app = express();// 建立express實例,賦值給app。 app.get('/',function(req,res){ res.status(200).send('Hello world!'); }); var server = require('http').createServer(app); var io = require('socket.io')(server); io.on('connection',function(socket){ }); server.listen(80);
服務端構建完畢,下面看一看客戶端應該如何使用。
服務端運行後會在根目錄動態生成socket.io的客戶端js文件,客戶端能夠經過固定路徑/socket.io/socket.io.js添加引用。
首先添加網頁index.html,並在網頁中引用客戶端js文件:
<script src="/socket.io/socket.io.js"></script>
或者也能夠引用官方的cdn文件
//官方CDN <script src="https://cdn.socket.io/socket.io-1.2.1.js"></script>
當客戶端成功加載socket.io客戶端文件後會獲取到一個全局對象io,咱們將經過io.connect函數來向服務端發起鏈接請求。
var socket = io.connect('/'); socket.on('connect',function(){ //鏈接成功 }); socket.on('disconnect',function(data){ //鏈接斷開 });
connect函數能夠接受一個url參數,url能夠socket服務的http完整地址,也能夠是相對路徑,若是省略則表示默認鏈接當前路徑。與服務端相似,客戶端也須要註冊相應的事件來捕獲信息,不一樣的是客戶端鏈接成功的事件是connect。
瞭解了客戶端如何使用,下面咱們建立網頁index.html,並添加以下內容(保存):
<html> <head> <script src="/socket.io/socket.io.js"></script> <script> window.onload = function(){ var socket = io.connect('/'); socket.on('connect',function(){ document.write('鏈接成功!'); }); }; </script> </head> <body> </body> </html>
頁面添加完畢還要記得在服務端app.js中爲它添加路由,讓咱們能夠訪問測試網頁:
app.get('/index',function(req,res){ res.sendFile('index.html',{root:__dirname}); });
服務端和客戶端都構建完畢了,下面開始發送消息吧。
當咱們成功創建鏈接後,咱們能夠經過socket對象的send函數來互相發送消息,示例-客戶端向服務端發送消息(index.html):
var socket = io.connect('/'); socket.on('connect',function(){ //客戶端鏈接成功後發送消息'hello world!' socket.send('hello world!'); }); socket.on('message',function(data){ alert(data); });
鏈接成功後,咱們向服務端發送消息_hello world!_,還爲socket註冊了_message_事件,它是_send_函數對應的接收消息的事件,當服務端向客戶端send消息時,咱們就能夠在_message_事件中接收到發送過來的消息。 服務端向客戶端發送消息也能夠經過_send_的方式,示例 - 服務端向客戶端發送消息(app.js):
var io = require('scoket.io'); io.on('connection',function(socket){ socket.send('你好啊!'); socket.on('message',function(data){ //收到消息 console.log(data); }); });
與客戶端相同,服務端也須要爲socket註冊message事件來接收客戶端發送過來的消息。
上面講了socket.io是什麼,它並非一項新的功能或者技術,它只是對目前實時通信技術的封裝,如HTML5中的網絡技術WebSocket、AJAX長輪詢、Iframe流等等,瞭解到它的一些優勢,如跨平臺、自適應等,咱們能夠藉助它快速建立統一高效的實時應用。
以上主要講了如何搭建一個最基本的socket服務器,使用最簡單的客戶端與服務器創建鏈接,並實現信息的互發,固然socket.io的功能遠不止如此,它還有不少很是實用的功能。