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