node实现简易聊天室功能

118 阅读1分钟

大家应该都想知道聊天功能到底该怎么实现 我这几天特意学了一下 发现其实不难 下面就给大家介绍一下

思路

先建立两个端口 一个用来创建聊天室我们称为a接口 一个接口是加入聊天的人我们称为b接口

image.png

这里的server.js就是用来创建聊天室的 client.js是可以加入聊天室聊天的人员

下面就来写一下接口把

1 server.js

// 聊天室
const net = require('net')

const server = net.createServer()
/**
 * net.createServer()方法。
 * 该方法接受一个回调函数作为参数
 * 该回调函数将在每次有新的连接时被调用。在回调函数中,我们可以设置服务器的响应行为
 * 例如向客户端发送消息、关闭连接等
 * 
 */

// 用户列表 
let clients = []

// 监听连接
server.on('connection', client => {
  // 我们使用client.on('data', ...)监听客户端发送的数据。
  client.on('data', (chunk) => {
    let data = chunk.toString()
 
    console.log(data);   // login:data
    // 如果数据匹配到"login:(.*)"的格式,表示有客户端要进行登录操作。
    if (data.match(/login:(.*)/)) {
      // 提取用户名 
      let name = data.match(/login:(.*)/)[1]
      // 将该用户名赋值给client.name属性
      client.name = name
      // 把用户传入clients数组
      clients.push(client)
      console.log(`用户${name}上线`);

    } else {
      /** 
       * 如果不是登录操作,即数据中不包含"login:",
       * 则认为是聊天消息。我们遍历客户端列表clients,
       * 对于每个客户端,判断其名字(client.name)是否
       * 与消息中的名字不相同。如果不相同,则调用write方法将消息发送给该客户端。
      */
      
      for (const client of clients) {
        if (client.name !== JSON.parse(data).name) {
          client.write(data)
        }
      }
    }
  })
  // 我们使用client.on('close', ...)监听客户端关闭
  client.on('close',()=>{
    console.log(`用户${client.name}下线`);
  })

  // 我们使用client.on('error', ...)监听客户端发生错误
  
  client.on('error',()=>{
    console.log(`用户${client.name}发生错误`);
  })
})

server.on('error',(err)=>{
  console.log('服务器错误',err);
})

server.on('close',()=>{
  console.log('服务器关闭');
})

server.listen(8000,()=>{
  console.log('服务器开启 8000');
})

可以看做是这是一个家族群 而client.js就是这个家的家庭成员了

// 聊天人员
const net = require('net')
const readline = require('readline')


// 创建一个与用户进行交互的接口,允许用户从控制台输入信息并输出响应
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
})

// 获取名字
const name = process.argv[2]
console.log(name,111);

// 连接服务器 开始对话 
const client = net.createConnection({ port: 8000 }, () => {
  console.log(name + '连接到服务器');
  // 使用client.write()方法向服务器发送一条消息
  client.write(`login:${name}`)
  // client对象的name属性设置为name变量的值,用于标识当前客户端的名称
  client.name = name
  // 开始发送信息
  sendMsg(client)
})

// 监听服务器的数据事件
client.on('data', (chunk) => {
  let data = JSON.parse(chunk.toString())
  if (data) {
    console.log(`[${data.name}]:[${data.msg}]`);
  }
})

// 服务器断开
client.on('end', () => {
  console.log('已从服务器断开');
})

// 服务器错误
client.on('error', () => {
  console.log('服务器错误');
})

// 一直递归输出
const sendMsg = () => {
  rl.question('', (line) => {
    client.write(JSON.stringify({
      name: client.name,
      msg: line
    }))
    sendMsg(client)
  })
}

功能展示 先开启聊天室 image.png

加入人员 开始聊天 image.png

image.png

image.png

image.png

这样 简单的聊天室就实现完成了 参考资料