溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

js代碼如何實(shí)現(xiàn)多人聊天室

發(fā)布時(shí)間:2021-11-15 09:07:59 來(lái)源:億速云 閱讀:148 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)js代碼如何實(shí)現(xiàn)多人聊天室,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

設(shè)計(jì)要求:

1)用戶應(yīng)通過(guò)注冊(cè)登錄聊天室
2)聊天室可以顯示所有在線用戶
3)在每一條聊天內(nèi)容之前,顯示發(fā)出這條聊天內(nèi)容的用戶名。
4)可進(jìn)行私密聊天。
5)當(dāng)用戶進(jìn)入和離開(kāi)聊天室時(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)聽(tīng)");
});

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)閉!!");
})

關(guān)于“js代碼如何實(shí)現(xiàn)多人聊天室”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

js
AI