UDP协议聊天室

186 阅读1分钟

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

const server = dgram.createSocket('udp4');

// 所有的用户信息 const users = [];

server.on('listening',() => { const address = server.address(); console.log(server running ${address.address}:${address.port}) })

server.on('message',(msg, remoteInfo) => { let data = JSON.parse(msg.toString()); switch (data.type) { case 'login': const index = users.findIndex((item) => item.nickname === data.nickname); if (index === -1) { users.push({ address: remoteInfo.address, port: remoteInfo.port, nickname: data.nickname }) return server.send(JSON.stringify({ type: 'login', result: true, msg: '登陆成功', nickname: data.nickname, total: users.length }), remoteInfo.port, remoteInfo.address) } else { return server.send(JSON.stringify({ type: 'login', result: false, msg: '用户名重复' }), remoteInfo.port, remoteInfo.address) } break case 'toast': users.map((item) => { server.send(JSON.stringify({ type: 'toast', msg: data.msg }), item.port, item.address); }) break case 'chat': console.log(data); users.map((item) => { server.send(JSON.stringify({ type: 'chat', data: data.data, nickname: data.nickname }), item.port, item.address); }) break case 'at': const user = users.find((item) => item.nickname === data.nickname); if (!user) { return server.send(JSON.stringify({ type: 'at', result: false, msg: '没有这个用户' }), remoteInfo.port, remoteInfo.address) } else { return server.send(JSON.stringify({ type: 'at', result: true, msg: data.msg, nickname: data.myNickname }), user.port, user.address) } break default: break } // console.log(server got ${msg} from ${remoteInfo.address}:${remoteInfo.port}) // server.send('world',remoteInfo.port, remoteInfo.address); })

server.on('error', err => { console.log('server error', err); })

server.bind(3000);

// client.js const dgram = require('dgram');

const client = dgram.createSocket('udp4');

var username = null;

// 首次登陆 if (!username) { console.log('请输入您的昵称:') process.stdin.on('data', data => { data = data.toString().trim(); // 用户登陆了 if (!username) { return client.send(JSON.stringify({ type: 'login', nickname: data }), 3000, 'localhost'); } const matches = /^@(\w+)\s(.+)$/.exec(data) if (matches) { return client.send(JSON.stringify({ type: 'at', nickname: matches[1], msg: matches[2], myNickname: username }), 3000, 'localhost') } return client.send(JSON.stringify({ type: 'chat', nickname: username, data: data }), 3000, 'localhost'); }) }

client.on('message', (msg, remoteInfo) => { let data = JSON.parse(msg.toString()); switch (data.type) { case 'login': if (data.result) { console.log(登陆成功,当前聊天室人数${data.total}) username = data.nickname; client.send(JSON.stringify({ type: 'toast', msg: ${username}进入了聊天室 }), 3000, 'localhost') } else { console.log(登陆失败,${data.msg}) process.stdout.write('请重新登陆') } break case 'toast': console.log(data.msg); break case 'chat': console.log(${data.nickname}说: ${data.data}) break case 'at': if (data.result) { console.log(${data.nickname}对你说: ${data.msg}) } else { console.log(失败${data.msg}) } break default: break } });

client.on('error',err => { console.log('client error', err); });