js代碼實現(xiàn)多人聊天室
本文實例為大家分享了js代碼實現(xiàn)多人聊天室的具體代碼,供大家參考,具體內(nèi)容如下
設(shè)計要求:
1)用戶應(yīng)通過注冊登錄聊天室
2)聊天室可以顯示所有在線用戶
3)在每一條聊天內(nèi)容之前,顯示發(fā)出這條聊天內(nèi)容的用戶名。
4)可進行私密聊天。
5)當(dāng)用戶進入和離開聊天室時,系統(tǒng)會在聊天室里廣播
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+"說: "+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) { //獲取注冊用戶的用戶名 var username=data.username; if(!users[username]){ //不存在,則保存用戶名和socket users[username]=socket; var send={ mstype:"signup", code:1000, username:username, message:"注冊成功" }; socket.write(JSON.stringify (send)); }else{//cunzai var send={ mstype:"signup", code:1001, message: "用戶名已被占,請重新輸入用戶名" } 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+"對你說"+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+"啟動監(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("請輸入用戶名:"); 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ā)給誰 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)閉??!"); })
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js構(gòu)造函數(shù)、索引數(shù)組和屬性的實現(xiàn)方式和使用
本文主要介紹和小結(jié)js的構(gòu)造函數(shù),關(guān)聯(lián)數(shù)組的實現(xiàn)方式和使用,及不可變對象和它的實現(xiàn)方式及他們使用過程中要注意的點,需要的朋友可以參考下2014-11-11javascript實現(xiàn)自動輸出文本(打字特效)
文字如何實現(xiàn)打字的效果呢?在瀏覽網(wǎng)頁的時候也經(jīng)常能看到這種效果。本文給大家匯總介紹了幾種打字效果的文字特效,文字一個一個地打印在頁面上。2015-08-08javascript應(yīng)用:Iframe自適應(yīng)其加載的內(nèi)容高度
javascript應(yīng)用:Iframe自適應(yīng)其加載的內(nèi)容高度...2007-04-04如何在uniapp中獲取可視區(qū)域的高度(uni.getSystemInfo)
這篇文章主要給大家介紹了關(guān)于如何在uniapp中獲取可視區(qū)域的高度(uni.getSystemInfo)的相關(guān)資料,文中通過圖文以及實例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用uniapp具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-04-04