多人聊天室2—Web后端上机实验

【实验】编写代码实现多人聊天室

参考代码如下:

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;
    var send={
        mstype:"broadcast",
        message:message
    };
    send=new Buffer(JSON.stringify(send));
    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]){
        users[username]=socket;
        var send={
            mstype:"signup",
            code:1000,
            username:username,
            message:"注册成功"
        };
        socket.write(JSON.stringify(send));
    }else{
        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.mes123sage;
    var receiver=users[to];
    if(!receiver){
        var send={
            mstype:"p2p",
            code:2001,
            message:"用户"+to+"不存在"
        }
        socket.write(JSON.stringify(send));
    }else{
        var send={
            mstype:"p2p",
            code:2000,
            message:from+"对你说:"+message
        }
        receiver.write(JSON.stringify(send));
    }
};

Server服务器端代码:

/**
 * p2p聊天室服务器
 */
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("服务器在端口"+config.port+"启动了监听。");
});

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();
        if(!username){
            var send={
                mstype:"signup",
                username:data
            };
            client.write(JSON.stringify(send));
            return;
        }
        var regex=/(.{1,18}):(.+)/;
        var matches=regex.exec(data);
        if(matches){
            var from=username;
            var to=matches[1];
            var message=matches[2];
            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("err",function () {
    console.log("聊天室已关闭!");
})

运行结果截图:

 广播截图:

 

 

 指定对话截图:

 

猜你喜欢

转载自blog.csdn.net/weixin_57398221/article/details/124439475