TCP协议聊天室

114 阅读1分钟

// server.js const net = require('net');

const server = net.createServer();

const types = require('./types')

// 存储通信,有多个客户端 const users = [];

server.on('connection', clientSocket => { clientSocket.on('data', data => { data = JSON.parse(data.toString().trim()); switch (data.type) { case types.login: // 如果昵称重复了 if (users.find(item => item.nickname === data.nickname)) { return clientSocket.write(JSON.stringify({ type: types.login, success: false, msg: '昵称已经重复' })) } clientSocket.nickname = data.nickname; users.push(clientSocket); clientSocket.write(JSON.stringify({ type: types.login, success: true, msg: '登陆成功', total: users.length, nickname: data.nickname })) break case types.broadcast: users.map((item) => { item.write(JSON.stringify({ type: types.broadcast, nickname: data.nickname, message: data.msg })) }) break case types.p2p: const user = users.find(item => item.nickname === data.nickname); if (!user) { return clientSocket.write(JSON.stringify({ type: types.p2p, success: false, msg: '该用户不存在' })) } user.write(JSON.stringify({ type: types.p2p, success: true, nickname: data.myNickname, msg: data.msg })) break case types.edit: users.map((item) => { item.write(JSON.stringify({ type: types.edit, nickname: data.nickname })) }) break default: break } })

// 离开
clientSocket.on('end', () => {
    const index = users.findIndex((item) => item.nickname === clientSocket.nickname);
    if (index !== -1) users.splice(index, 1);
    users.map((item) => {
        item.write(JSON.stringify({
            type: types.edit,
            msg: `${clientSocket.nickname}离开了聊天室`
        }))
    })
})

})

server.listen(3000, () => { console.log('server running') })

// client.js*n const net = require('net');

const types = require('./types');

let nickname = null;

const client = net.createConnection({ host: '127.0.0.1', port: 3000 })

client.on('connect', () => { console.log('客户端建立连接成功'); process.stdout.write('请输入昵称:'); process.stdin.on('data', data => { data = data.toString().trim();

    const matches = /^@(\w+)\s(.+)$/.exec(data)
    if (matches) {
        return client.write(JSON.stringify({
            type: types.p2p,
            nickname: matches[1],
            msg: matches[2],
            myNickname: nickname
        }))
    }
    if (!nickname) {
      return client.write(JSON.stringify({
          type: types.login,
          nickname: data
      }))
    }
    client.write(JSON.stringify({
        type: types.broadcast,
        msg: data,
        nickname: nickname
    }))
})

})

// 监听服务端发送过来的数据 client.on('data', data => { data = JSON.parse(data.toString()); switch (data.type) { case types.login: if (data.success) { console.log(登陆成功,当前在线人数是${data.total}); nickname = data.nickname client.write(JSON.stringify({ type: types.edit, nickname: nickname })) } else { console.log(登陆失败,${data.msg}) process.stdout.write('请重新输入') } break case types.broadcast: console.log(${data.nickname}: ${data.message}) break case types.p2p: if (data.success) { console.log(${data.nickname}对你说,${data.msg}) } else { console.log(发送失败,原因是${data.msg}) } break case types.edit: console.log(${data.nickname}进入了聊天室) break default: break } })

// types.js module.exports = { login: 0, broadcast: 1, p2p: 2, edit: 3 }