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