js代碼實(shí)現(xiàn)多人聊天室
本文實(shí)例為大家分享了js代碼實(shí)現(xiàn)多人聊天室的具體代碼,供大家參考,具體內(nèi)容如下
設(shè)計(jì)要求:
1)用戶應(yīng)通過(guò)注冊(cè)登錄聊天室
2)聊天室可以顯示所有在線用戶
3)在每一條聊天內(nèi)容之前,顯示發(fā)出這條聊天內(nèi)容的用戶名。
4)可進(jìn)行私密聊天。
5)當(dāng)用戶進(jìn)入和離開聊天室時(shí),系統(tǒng)會(huì)在聊天室里廣播
config.js 代碼如下
module.exports={
"port":3000,
"host":"127.0.0.1"
}
broadcast.js 代碼如下
exports.broadcast=function (data,users) {
var from=data.from;
var message=data.message;
message = from+"說(shuō): "+message;
//構(gòu)建消息
var send={
mstype:"broadcast",
message:message
};
send =new Buffer(JSON.stringify(send));
//遍歷用戶組所有用戶,出發(fā)送方的所有用戶
for(var username in users){
if(username!=from){
users[username].write(send);
}
}
};
Signup.js 代碼如下
exports.signup = function (socket,data,users) {
//獲取注冊(cè)用戶的用戶名
var username=data.username;
if(!users[username]){ //不存在,則保存用戶名和socket
users[username]=socket;
var send={
mstype:"signup",
code:1000,
username:username,
message:"注冊(cè)成功"
};
socket.write(JSON.stringify (send));
}else{//cunzai
var send={
mstype:"signup",
code:1001,
message: "用戶名已被占,請(qǐng)重新輸入用戶名"
}
socket.write(JSON.stringify(send));
}
};
p2p.js 代碼如下
exports.p2p=function (socket,data,users) {
var from=data.from;
var to=data.to;
var message=data.message;
var receiver=users[to];
if(!receiver){//接收方不存在
var send={
mstype:"p2p",
code:2001,
message:"用戶"+to+"不存在"
}
socket.write(JSON.stringify(send));
}else{
//存在則向接收方發(fā)送信息
var send={
mstype:"p2p",
code:2000,
from:from,
message:from+"對(duì)你說(shuō)"+message
}
receiver.write(JSON.stringify(send));
}
};
Server服務(wù)器端代碼
//p2p 聊天室服務(wù)器
var net=require("net");
var config=require("./config");
var broadcast=require("./broadcast");
var p2p=require("./p2p");
var signup=require("./signup");
var users={};
var server=net.createServer();
server.on ("connection",function (socket) {
socket.on("data",function (data) {
data = JSON.parse(data);
switch (data.mstype) {
case "signup":
signup.signup(socket, data, users);
break;
case "broadcast":
broadcast.broadcast(data, users);
break;
case "p2p":
p2p.p2p(socket, data, users);
break;
default:
break;
}
});
socket.on("error",function () {
console.log("有客戶端異常退出了");
});
});
server.listen(config.port,config.host,function () {
console.log("服務(wù)器在端口"+config.port+"啟動(dòng)監(jiān)聽");
});
Client客戶端代碼如下:
var net=require("net");
var config=require("./config");
var Client=net.createConnection({
port:config.port,
host:config.host
});
var username;
Client.on("connect",function () {
console.log("請(qǐng)輸入用戶名:");
process.stdin.on("data",function (data){
data=data.toString().trim();
//判斷用戶是否已經(jīng)存在
if(! username){
var send={
mstype:"signup",
username:data
};
Client.write(JSON.stringify(send));
return;
}
var regex=/(.{1,18}):(.+)/;
var matches=regex=regex.exec(data);
if(matches){
//能匹配則是p2p
var from=username;//發(fā)送方是自己
var to=matches[1];//發(fā)給誰(shuí)
var message=matches[2];
//構(gòu)造JSON形式信息
var send={
mstype: "p2p",
from:username,
to:to,
message:message
};
Client.write(JSON.stringify(send));
}else{
//廣播
var send={
mstype:"broadcast",
from:username,
message:data
};
Client.write(JSON.stringify(send));
}
});
});
Client.on("data",function (data) {
data=JSON.parse(data);
switch (data.mstype) {
case "signup":
var code=data.code;
switch (code) {
case 1000:
username=data.username;
console.log(data.message);
break;
case 1001:
console.log(data.message);
break;
default:
break;
}
break;
case "broadcast":
console.log(data.message);
break;
case "p2p":
var code=data.code;
switch (code) {
case 2000:
console.log(data.message);
break;
case 2001:
console.log(data.message);
break;
default:
break;
}
break;
default:
break;
}
});
Client.on("error",function () {
console.log("聊天室已關(guān)閉!!");
})
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- nodejs實(shí)現(xiàn)的一個(gè)簡(jiǎn)單聊天室功能分享
- 使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
- js編寫簡(jiǎn)單的聊天室功能
- AngularJS+Node.js實(shí)現(xiàn)在線聊天室
- Ajax PHP JavaScript MySQL實(shí)現(xiàn)簡(jiǎn)易無(wú)刷新在線聊天室
- JavaScript仿聊天室聊天記錄
- javascript實(shí)現(xiàn)簡(jiǎn)易聊天室
- Nodejs實(shí)現(xiàn)多房間簡(jiǎn)易聊天室功能
- NodeJS實(shí)現(xiàn)一個(gè)聊天室功能
- Node.js中使用socket創(chuàng)建私聊和公聊聊天室
相關(guān)文章
微信小程序?qū)崿F(xiàn)購(gòu)物車選擇規(guī)格顏色效果
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)購(gòu)物車選擇規(guī)格顏色選中效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
使用typescript改造koa開發(fā)框架的實(shí)現(xiàn)
這篇文章主要介紹了使用typescript改造koa開發(fā)框架的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
如何將php數(shù)組或者對(duì)象傳遞給javascript
這篇文章主要介紹了將php數(shù)組或者對(duì)象傳遞給javascript的方法,需要的朋友可以參考下2014-03-03
圖片img的src不變讓瀏覽器重新加載實(shí)現(xiàn)方法
圖片img的src不變,想讓瀏覽器重新加載怎么辦,在圖片地址src不變的情況下讓瀏覽器重新加載圖片,實(shí)際上在src不變時(shí),瀏覽器直接就去讀取緩存2013-03-03
關(guān)于JS精度丟失產(chǎn)生的原因以及解決方案
在處理一些極端情況下的復(fù)雜數(shù)值計(jì)算時(shí),我們可能會(huì)遇到這樣的情況,就是運(yùn)算結(jié)果丟失精度,下面這篇文章主要給大家介紹了關(guān)于JS精度丟失產(chǎn)生的原因以及解決方案的相關(guān)資料,需要的朋友可以參考下2024-01-01
動(dòng)態(tài)加載js文件 document.createElement
動(dòng)態(tài)加載js文件 document.createElement...2006-10-10
淺談Javascript如何實(shí)現(xiàn)勻速運(yùn)動(dòng)
這篇文章主要介紹了淺談Javascript如何實(shí)現(xiàn)勻速運(yùn)動(dòng)的方法及相關(guān)代碼,需要的朋友可以參考下2014-12-12
關(guān)于__defineGetter__ 和__defineSetter__的說(shuō)明
關(guān)于__defineGetter__ 和__defineSetter__的說(shuō)明...2007-05-05

