WebSocket+node.js創(chuàng)建即時(shí)通信的Web聊天服務(wù)器
本文實(shí)例node.js創(chuàng)建即時(shí)通信的Web聊天服務(wù)器,供大家參考,具體內(nèi)容如下
1.使用nodejs-websocket
nodejs-websocket是基于node.js編寫(xiě)的一個(gè)后端實(shí)現(xiàn)websocket協(xié)議的庫(kù),
連接:https://github.com/sitegui/nodejs-websocket。
(1)安裝
在項(xiàng)目目錄下通過(guò)npm安裝:npm install nodejs-websocket
(2)創(chuàng)建服務(wù)器
//引入nodejs-websocket
var ws = require(“nodejs-websocket”);
//調(diào)用createServer方法創(chuàng)建服務(wù)器,回調(diào)函數(shù)中的conn是connection的實(shí)例
var server = ws.create(function(conn){
console.log(“New connection”);
//監(jiān)聽(tīng)text事件,text事件每當(dāng)從服務(wù)器收到文本類型數(shù)據(jù)時(shí)觸發(fā),回調(diào)函數(shù)的參數(shù)為傳過(guò)來(lái)的字符串
conn.on(“text”, function(str){
console.log(“Received ” + str);
});
//監(jiān)聽(tīng)close事件,每次斷開(kāi)連接時(shí)觸發(fā)
conn.on(“close”, function(code, reason){
console.log(“Connection closed”);
})
}).listen(8888);
2.客戶端使用websocket
在客戶端首先需要實(shí)例化一個(gè)websocket對(duì)象:ws = new WebSocket("ws://localhost:5000");其中的參數(shù)傳入格式為ws://+url,這就和http協(xié)議前綴http://一樣。接下來(lái)就可以通過(guò)websocket內(nèi)置的一些方法進(jìn)行事件監(jiān)聽(tīng)和數(shù)據(jù)展示。
這里統(tǒng)一介紹各個(gè)監(jiān)聽(tīng)事件:onopen當(dāng)服務(wù)器和客戶端建立起連接時(shí)觸發(fā);onmessage當(dāng)客戶端收到服務(wù)器發(fā)送的數(shù)據(jù)時(shí)觸發(fā); onclose當(dāng)客戶端和服務(wù)器的連接關(guān)閉時(shí)觸發(fā);onerror當(dāng)連接出現(xiàn)錯(cuò)誤時(shí)觸發(fā)。
3.使用websocket+nodejs實(shí)現(xiàn)在線聊天室
(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>客戶端已斷開(kāi)連接</li>";
};
ws.onerror=function(evt){
oUl.innerHTML+="<li>"+evt.data+"</li>";
};
};
oSend.onclick=function(){
if(ws){
ws.send(oInput.value);
}
}(3)服務(wù)器端js:
/*
websocket支持兩種類型的數(shù)據(jù)傳輸:text類型和binary類型,其中二進(jìn)制數(shù)據(jù)是通過(guò)流的模式發(fā)送和讀取的
*/
var app=require('http').createServer(handler); //為了簡(jiǎn)化代碼,將服務(wù)器創(chuàng)建具體代碼放到handler函數(shù)中
var ws=require('nodejs-websocket');
var fs=require('fs');
app.listen(8888);
function handler(req,res){
//__dirname返回該文件所在的當(dāng)前目錄。調(diào)用readFile方法進(jìn)行文件讀取
fs.readFile(__dirname+'/index.html',function(err,data){
if(err){
res.writeHead(500);
return res.end('error ');
}
res.writeHead(200);
res.end(data);
});
}
//以上步驟成功在8888端口渲染出相應(yīng)的html界面
//conn是對(duì)應(yīng)的connection的實(shí)例
var server = ws.createServer(function(conn){
console.log('new conneciton');
//監(jiān)聽(tīng)text事件,每當(dāng)收到文本時(shí)觸發(fā)
conn.on("text",function(str){
broadcast(server,str);
});
//當(dāng)任何一端關(guān)閉連接時(shí)觸發(fā),這里就是在控制臺(tái)輸出connection closed
conn.on("close",function(code,reason){
console.log('connection closed');
})
}).listen(5000);
//注意這里的listen監(jiān)聽(tīng)是剛才開(kāi)通的那個(gè)服務(wù)器的端口,客戶端將消息發(fā)送到這里處理
function broadcast(server, msg) {
//server.connections是一個(gè)數(shù)組,包含所有連接進(jìn)來(lái)的客戶端
server.connections.forEach(function (conn) {
//connection.sendText方法可以發(fā)送指定的內(nèi)容到客戶端,傳入一個(gè)字符串
//這里為遍歷每一個(gè)客戶端為其發(fā)送內(nèi)容
conn.sendText(msg);
})
}
以上就是本文
的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
nodejs中操作mysql數(shù)據(jù)庫(kù)示例
這篇文章主要介紹了nodejs中操作mysql數(shù)據(jù)庫(kù)示例,本文演示了如何在NodeJS中創(chuàng)建創(chuàng)建mysql連接、mysql數(shù)據(jù)庫(kù)、插入數(shù)據(jù)、查詢數(shù)據(jù)等功能,需要的朋友可以參考下2014-12-12
Node.js?內(nèi)置模塊fs文件系統(tǒng)操作示例詳解
這篇文章主要為大家介紹了Node.js?內(nèi)置模塊fs文件系統(tǒng)操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
3分鐘快速搭建nodejs本地服務(wù)器方法運(yùn)行測(cè)試html/js
本篇文章主要介紹了3分鐘快速搭建nodejs本地服務(wù)器方法運(yùn)行測(cè)試html/js,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04
Windows下nodejs安裝及環(huán)境配置的實(shí)戰(zhàn)步驟
最近換了一個(gè)電腦,因?yàn)橐褂玫絅odeJS,我將我自己的安裝步驟分享給大家,下面這篇文章主要給大家介紹了關(guān)于Windows下nodejs安裝及環(huán)境配置的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
node.js+postman+mongodb搭建測(cè)試注冊(cè)接口的實(shí)現(xiàn)
本文主要介紹了node.js+postman+mongodb搭建測(cè)試注冊(cè)接口的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

