NET 模块聊天室
NET 模块是 nodejs 中的 net 网络模块,通过 net 模块做一个简单的聊天室
首先要准备好要做的步骤,和需要的知识点:
1. 聊天室要分为客户端和服务端
需要用到 new net.server(创建一个 net 网络服务) ,new net.connect(创建一个客户端)
2. 客户端和服务器都需要连接
需要用到 net.socket 服务
3. 客户端需要读取输入信息,和提示用户信息
需要用到 process.stdout 可写流 ,process.stdin 可读流
4. 需要拟定协议,规定 n:用户名 为起名,s:用户名+空格+内容 为私聊某人,g:内容为广播,err: 为错误
简单需求:
客户端: 登录起名,群聊广播,私聊单发,退出提示
服务端: 保存连接,判断信息并处理,接受断开连接的信息并提示
接下来就开始写代码:
客户端:
//导入net
const net = require("net");
// 设置提示
const cout = process.stdout; //可写
//设置写入
const cin = process.stdin; //可读 电脑读我们写的东西
//创建socket连接服务
var socket = new net.Socket();
//存储拼接好的内容
var client = null;
//存储用户名
var nick = "";
//处理用户输入数据
cin.on("data", function(data) {
// console.log(data.toString());
if (data.toString()[0] == "@") {
//私聊
var info = Intercept(data.toString());
var userInfo = Division(info);
// console.log(userInfo.length);
// console.log(userInfo);
if (userInfo.length != 2) {
client = "err:";
} else {
client =
"s:" +
nick +
":" +
userInfo[0] +
":" +
userInfo[1].replace(/[\r\n]/gi, "");
}
} else {
if (nick == "") {
//设置用户名
nick = data.toString().replace(/[\r\n]/gi, "");
client = "n:" + nick;
} else {
//广播
if (data.toString()) client = data.toString().replace(/[\r\n]/gi, "");
client = "g:" + nick + ":" + client;
}
}
socket.write(client);
});
//获取服务器返回信息
socket.on("data", function(data) {
// console.log(data.toString());
// socket.write(data.toString());
if (data.toString() == nick) {
nick = "";
cout.write("该名称已被占用,请重新输入");
} else {
cout.write(data.toString());
}
});
//开启客户端连接,提示输入
socket.on("connect", function() {
cout.write("请输入名字\n");
});
//按空格分割字符串
function Division(info) {
userInfo = info.split(" ");
for (var i = 2; i < userInfo.length; i++) {
userInfo[1] += " " + userInfo[i];
}
return userInfo;
}
//截取@符号
function Intercept(info) {
userInfo = info.substr(1);
return userInfo;
}
//连接服务器3000端口
socket.connect(3000);
服务器:
//导入net模块
const net = require("net");
//新建一个net服务
const server = new net.Server();
//存储用户连接点
const clients = [];
//存储用户名列表
const userlist = [];
//存储当前连接的用户
var client = "";
//建立连接,监听客户端连接
server.on("connection", function(socket) {
socket.on("data", function(data) {
client = socket;
console.log(data.toString());
// client = data.toString();
console.log(socket.remoteAddress);
info = msg(data.toString());
if (info[0] == "n") {
if (in_array(info[1], userlist)) {
socket.write(info[1]);
} else {
socket.write(
`欢迎来到聊天室,现在有${clients.length}个同伴已经在聊天室了哦!`
);
var say = `${info[1]}加入聊天室`;
group(clients, say);
clients.push(socket);
userlist.push(info[1]);
}
} else if (info[0] == "s") {
var id = in_array(info[2], userlist);
// console.log(userlist);
// console.log(info[2]);
if (in_array(info[2], userlist)) {
clients[id].write(`${info[1]}@您:${info[3]}`);
} else {
socket.write("您@的用户不在聊天室中哦!");
}
} else if (info[0] == "g") {
var say = `${info[1]}:${info[2]}`;
group(clients, say);
} else if (info[0] == "err") {
socket.write('您的输入格式不符合要求,请输入 "操作菜单"查看\n'); //(操作菜单没写)
}
});
//有人退出时触发
socket.on("end", function() {
var id = in_array(socket, clients);
console.log(id);
var say = `系统: ${userlist[id]}退出聊天室`;
group(clients, say);
clients.splice(id, 1);
userlist.splice(id, 1);
});
});
//按":" 将字符串截成数组
function msg(msgs) {
userinfo = msgs.split(":");
return userinfo;
}
//广播循环给客户端发送信息
function group(clients, say) {
for (var i = 0; i < clients.length; i++) {
if (clients[i] == client) {
} else {
clients[i].write(say);
}
}
}
//查看字符串是否属于某数组
function in_array(search, array) {
for (var i in array) {
if (array[i] == search) {
return i;
}
}
return false;
}
//监听3000端口
server.listen(3000);
代码执行情况:
服务器:
启动:
客户端
启动:
首次登录注册用户名;
注册:
私聊时用@用户名+空格+说话内容;
私聊格式:
广播时直接输入要说的内容;
广播:
本文由 倪建成学习时 编辑,只是普通笔记。若是对你有用,可以自行转载
最后编辑时间为:2019-08-02 00:00:00