NET模块聊天室

博客分类: 笔记 阅读次数: comments

NET模块聊天室

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);

代码执行情况:

​ 服务器:

​ 启动:

​ 客户端

​ 启动:

​ 首次登录注册用户名;

​ 注册:

​ 私聊时用@用户名+空格+说话内容;

​ 私聊格式:

​ 广播时直接输入要说的内容;

​ 广播: