1. 程式人生 > >socket.io筆記

socket.io筆記

開始 測試 creates bubuko ejs 使用 .get 保存 當前

WebSocket

WebSocket是HTML5開始提供的一種瀏覽器與服務器間進行全雙工通訊的網絡技術。

現很多網站為了實現即時通訊,所用的技術都是輪詢(polling)。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務器發出HTTP請求,然後由服務器返回最新的數據給客服端的瀏覽器,這種方式有一個很大的弊端,就是會占用很多的帶寬。

最新的輪詢效果是Comet – 用了AJAX。但這種技術雖然可達到全雙工通信,但依然需要發出請求。

使用WebSocket,瀏覽器和服務器只需要要做一個握手的動作,然後,瀏覽器和服務器之間就形成了一條快速通道,兩者之間就直接可以數據互相傳送。而且它為我們實現即時服務帶來了兩大好處:

  • 節省資源:互相溝通的Header是很小的-大概只有 2 Bytes。
  • 推送信息:不需要客戶端請求,服務器可以主動傳送數據給客戶端。

實現了websocket的瀏覽器:

技術分享圖片

socket.io

Socket.IO是一個WebSocket庫,包括了客戶端的js和服務器端的nodejs,它的目標是構建可以在不同瀏覽器和移動設備上使用的實時應用

socket.io的特點

  • 易用性:socket.io封裝了服務端和客戶端,使用起來非常簡單方便。
  • 跨平臺:socket.io支持跨平臺,這就意味著你有了更多的選擇,可以在自己喜歡的平臺下開發實時應用。
  • 自適應:它會自動根據瀏覽器從WebSocket、AJAX長輪詢、Iframe流等等各種方式中選擇最佳的方式來實現網絡實時應用,非常方便和人性化,而且支持的瀏覽器最低達IE5.5。

安裝部署

socket.io支持跨平臺,在不同平臺下,它的使用方法也是大同小異,下面我們就來安裝使用它

首先要下載安裝node環境,然後通過npm安裝socket.io

npm install socket.io

服務監聽

socket.io的服務端啟動非常的簡單,引用socket.io模塊。

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中的網絡技術WebSocketAJAX長輪詢Iframe流等等,了解到它的一些優點,如跨平臺、自適應等,我們可以借助它快速創建統一高效的實時應用。

以上主要講了如何搭建一個最基本的socket服務器,使用最簡單的客戶端與服務器建立連接,並實現信息的互發,當然socket.io的功能遠不止如此,它還有很多非常實用的功能。

socket.io筆記