var express = require('express') //引入express模块 var http = require("http") //引入http模块 var app = express() app.use('/', express.static('./public')); //设置静态资源路径 var server = http.createServer(app) server.listen(3000,'0.0.0.0'); //监听端口3000 var io = require('socket.io').listen(server); //引入socket.io模块并绑定到服务器 var AllUser=[]; io.on('connection',function(socket){ socket.on("login",function(r){//接收请求 r 为前端发送的参数 r.name 用户名称 r.img 用户头像 let user = { name:r.name, img:r.img, ip:socket.handshake.address, id:r.id, socket:socket } if(r.id=='' || r.id=="undefined"){//如果是新访问的用户是没有id存在cookie的 需要用soucket的id 否则就使用cookie的id user.id = socket.id; }else{ socket.id=r.id; } AllUser.push(user);//将定义的变量user添加至全局变量AllUser中 用于显示用户列表的用户信息 var User = [];//定义一个User变量 将用户列表所需的信息添加进去 for (const key in AllUser) { let qq = { name:AllUser[key].name, img:AllUser[key].img, id:AllUser[key].id, }; User.push(qq); } socket.emit("login",{ "id": user.id});//发送id给客户端 将id设置至cookie中 io.sockets.emit("AllUser",{"AllUser":User});//给所有在线的用户 发送用户列表更新 }); socket.on("send",function(r){//消息发送 r.accept 接收方id r.send 发送方id r.date = new Date().toLocaleTimeString();//时间 if(r.accept=="all"){//如果接收方id为 all 就像所有在线用户发送消息 io.sockets.emit("send",r);//向公共聊天室发送消息 }else{//否则就是私聊操作 socket.emit("send",r);//给当前的用户发送 for (let i = 0; i < AllUser.length; i++) { if(AllUser[i].id == r.accept){//匹配存储的用户信息 id 与 r.accept 接收者相同 给这个用户发送消息 AllUser[i].socket.emit("send",r);//私聊发送消息 break;//结束循环 } } } }); socket.on('disconnect',function(){//连接断开 var index = -1; for (const key in AllUser) {//找到匹配存储的用户信息 将他从存储用户信息变量中删除 if(socket.id == AllUser[key].id){ AllUser.splice(key,1);// key 为数组的索引值 1为删除的个数 } } var User = []; for (const key in AllUser) {//定义一个User变量 将用户列表所需的信息添加进去 let qq = { name:AllUser[key].name, img:AllUser[key].img, id:AllUser[key].id, }; User.push(qq); } io.sockets.emit("AllUser",{"AllUser":User});//更新用户列表信息 }) }); console.log("Server running: http://127.0.0.1:3000");//打印控制台