1. 程式人生 > >WebSocket+node.js建立即時通訊的Web聊天伺服器

WebSocket+node.js建立即時通訊的Web聊天伺服器

1.使用nodejs-websocket
nodejs-websocket是基於node.js編寫的一個後端實現websocket協議的庫,
連線:https://github.com/sitegui/nodejs-websocket。
(1)安裝
在專案目錄下通過npm安裝:npm install nodejs-websocket
(2)建立伺服器
//引入nodejs-websocket
var ws = require(“nodejs-websocket”);
//呼叫createServer方法建立伺服器,回撥函式中的conn是connection的例項
var server = ws.create(function(conn){
    console.log(“New connection”);
    //監聽text事件,text事件每當從伺服器收到文字型別資料時觸發,回撥函式的引數為傳過來的字串
    conn.on(“text”, function(str){
 	console.log(“Received ” + str);
    });
    //監聽close事件,每次斷開連線時觸發
    conn.on(“close”, function(code, reason){
	console.log(“Connection closed”);
    })
}).listen(8888);

2.客戶端使用websocket
在客戶端首先需要例項化一個websocket物件:ws = new WebSocket("ws://localhost:5000");其中的引數傳入格式為ws://+url,這就和http協議字首http://一樣。接下來就可以通過websocket內建的一些方法進行事件監聽和資料展示。
這裡統一介紹各個監聽事件:onopen當伺服器和客戶端建立起連線時觸發;onmessage當客戶端收到伺服器傳送的資料時觸發; onclose當客戶端和伺服器的連線關閉時觸發;onerror當連接出現錯誤時觸發。

3.使用websocket+nodejs實現線上聊天室
(1)html和css程式碼省略
(2)客戶端js:     
oConnect.onclick=function(){
        ws=new WebSocket('ws://localhost:5000');
         ws.onopen=function(){
             oUl.innerHTML+="<li>客戶端已連線</li>";
         }
        ws.onmessage=function(evt){
            oUl.innerHTML+="<li>"+evt.data+"</li>";
        }
        ws.onclose=function(){
            oUl.innerHTML+="<li>客戶端已斷開連線</li>";
        };
        ws.onerror=function(evt){
            oUl.innerHTML+="<li>"+evt.data+"</li>";
 
        };
    };
    oSend.onclick=function(){
        if(ws){
           ws.send(oInput.value);
        }
    }
(3)伺服器端js:
/*
websocket支援兩種型別的資料傳輸:text型別和binary型別,其中二進位制資料是通過流的模式傳送和讀取的
*/
var app=require('http').createServer(handler);  //為了簡化程式碼,將伺服器建立具體程式碼放到handler函式中
var ws=require('nodejs-websocket');
var fs=require('fs');
app.listen(8888);
function handler(req,res){
    //__dirname返回該檔案所在的當前目錄。呼叫readFile方法進行檔案讀取
    fs.readFile(__dirname+'/index.html',function(err,data){
        if(err){
            res.writeHead(500);
            return res.end('error ');
        }
        res.writeHead(200);
        res.end(data);
    });
}
//以上步驟成功在8888埠渲染出相應的html介面
//conn是對應的connection的例項
var server = ws.createServer(function(conn){
    console.log('new conneciton');
    //監聽text事件,每當收到文字時觸發
    conn.on("text",function(str){
        broadcast(server,str);
    });
    //當任何一端關閉連線時觸發,這裡就是在控制檯輸出connection closed
    conn.on("close",function(code,reason){
        console.log('connection closed');
    })
}).listen(5000);
//注意這裡的listen監聽是剛才開通的那個伺服器的埠,客戶端將訊息傳送到這裡處理
 
function broadcast(server, msg) {
    //server.connections是一個數組,包含所有連線進來的客戶端
    server.connections.forEach(function (conn) {
        //connection.sendText方法可以傳送指定的內容到客戶端,傳入一個字串
        //這裡為遍歷每一個客戶端為其傳送內容
        conn.sendText(msg);
    })
}