const { log } = require('console'); var app = require('express')(); var http = require('http').createServer(app); var io = require('socket.io')(http); app.get('/', (req, res) => { res.send('

Hello world

'); }); // 用户登录后保存用户登录列表 var OnlineUserList = []; // 保存群列表 var GroupList = {}; // 保存群的聊天记录 var HistoryList = {}; // 消息分为两种 // 用户消息 // 系统消息 // 监听客户端是否和服务器建立链接了 io.on('connection', (socket) => { // 用户登录 socket.on("UserLogin", (res) => { var isHaveUser = OnlineUserList.filter(v=>{ return v.name == res.name }) // 判断是否有这个用户 if (isHaveUser.length == 0) { OnlineUserList.push(res) socket.emit('LoginSuccess', res) } else { socket.emit('UserAlready', '用户名已存在,请改名!'); } }) /** * 加入房间 */ socket.on("JoinRoom", (res) => { // 如果存在,表示房间有了 if (GroupList.hasOwnProperty(res.room)) { var isHave = GroupList[res.room].filter(v=>{ return v.name == res.name }) // 没有 if (isHave.length == 0) { GroupList[res.room].push({ name: res.name, url: res.url }); socket.join(res.room); // 向房间内的所有人发送欢迎信息 io.in(res.room).emit('WelcomeUser', `欢迎用户:${res.name}加入群`); io.in(res.room).emit('RoomOnline', GroupList[res.room]); } else { socket.join(res.room); io.in(res.room).emit('RoomOnline', GroupList[res.room]); } } else { // 生成房间,但是人数为空 GroupList[res.room] = [] // 将用户放入群列表中 GroupList[res.room].push({ name: res.name, url: res.url }); // 将当前连接的客户端加入群聊 socket.join(res.room); // 向房间内的所有人发送欢迎信息 io.in(res.room).emit('WelcomeUser', `欢迎用户:${res.name}加入群`); io.in(res.room).emit('RoomOnline', GroupList[res.room]); // { // "1001": [] // } } }) /** * 发送消息 */ socket.on("SendMessage", (res) => { // 保存历史记录,但是先判断是否已经有人聊天了 if (!HistoryList.hasOwnProperty(res.room)) { HistoryList[res.room] = []; } HistoryList[res.room].push(res) socket.to(res.room).emit('SetMessage', res); }) /** * 返回聊天记录给前端 */ socket.on("GetHistoryList", (res) => { if (HistoryList.hasOwnProperty(res.room)) { socket.emit("SetHistory", HistoryList[res.room]); } else { socket.emit("SetHistory", []); } }) /** * 抖动效果 */ socket.on("Shake", (res) => { socket.to(res.room).emit('StartShake'); }) // disconnect 客户端掉线的时候,服务器能够通过 disconnect 事件监听到 socket.on('disconnect', () => { console.log('有个客户端掉线了'); }); }); http.listen(3000, () => { console.log('listening on *:3000'); });