[Expérience] Écrire du code pour implémenter une salle de discussion multi-personnes
Le code de référence est le suivant :
Le code config.js est le suivant
module.exports={
"port":3000,
"host":"127.0.0.1"
}
Le code Broadcast.js est le suivant
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);
}
}
};
Le code Signup.js est le suivant
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));
}
};
Le code p2p.js est le suivant
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));
}
};
Code côté serveur serveur :
/**
* 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+"启动了监听。");
});
Le code client est le suivant :
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("聊天室已关闭!");
})
Capture d'écran des résultats en cours d'exécution :
Capture d'écran de diffusion :
Spécifiez la capture d'écran de la conversation :