app.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. var express = require('express') //引入express模块
  2. var http = require("http") //引入http模块
  3. var app = express()
  4. app.use('/', express.static('./public')); //设置静态资源路径
  5. var server = http.createServer(app)
  6. server.listen(3000,'0.0.0.0'); //监听端口3000
  7. var io = require('socket.io').listen(server); //引入socket.io模块并绑定到服务器
  8. var AllUser=[];
  9. io.on('connection',function(socket){
  10. socket.on("login",function(r){//接收请求 r 为前端发送的参数 r.name 用户名称 r.img 用户头像
  11. let user = {
  12. name:r.name,
  13. img:r.img,
  14. ip:socket.handshake.address,
  15. id:r.id,
  16. socket:socket
  17. }
  18. if(r.id=='' || r.id=="undefined"){//如果是新访问的用户是没有id存在cookie的 需要用soucket的id 否则就使用cookie的id
  19. user.id = socket.id;
  20. }else{
  21. socket.id=r.id;
  22. }
  23. AllUser.push(user);//将定义的变量user添加至全局变量AllUser中 用于显示用户列表的用户信息
  24. var User = [];//定义一个User变量 将用户列表所需的信息添加进去
  25. for (const key in AllUser) {
  26. let qq = {
  27. name:AllUser[key].name,
  28. img:AllUser[key].img,
  29. id:AllUser[key].id,
  30. };
  31. User.push(qq);
  32. }
  33. socket.emit("login",{ "id": user.id});//发送id给客户端 将id设置至cookie中
  34. io.sockets.emit("AllUser",{"AllUser":User});//给所有在线的用户 发送用户列表更新
  35. });
  36. socket.on("send",function(r){//消息发送 r.accept 接收方id r.send 发送方id
  37. r.date = new Date().toLocaleTimeString();//时间
  38. if(r.accept=="all"){//如果接收方id为 all 就像所有在线用户发送消息
  39. io.sockets.emit("send",r);//向公共聊天室发送消息
  40. }else{//否则就是私聊操作
  41. socket.emit("send",r);//给当前的用户发送
  42. for (let i = 0; i < AllUser.length; i++) {
  43. if(AllUser[i].id == r.accept){//匹配存储的用户信息 id 与 r.accept 接收者相同 给这个用户发送消息
  44. AllUser[i].socket.emit("send",r);//私聊发送消息
  45. break;//结束循环
  46. }
  47. }
  48. }
  49. });
  50. socket.on('disconnect',function(){//连接断开
  51. var index = -1;
  52. for (const key in AllUser) {//找到匹配存储的用户信息 将他从存储用户信息变量中删除
  53. if(socket.id == AllUser[key].id){
  54. AllUser.splice(key,1);// key 为数组的索引值 1为删除的个数
  55. }
  56. }
  57. var User = [];
  58. for (const key in AllUser) {//定义一个User变量 将用户列表所需的信息添加进去
  59. let qq = {
  60. name:AllUser[key].name,
  61. img:AllUser[key].img,
  62. id:AllUser[key].id,
  63. };
  64. User.push(qq);
  65. }
  66. io.sockets.emit("AllUser",{"AllUser":User});//更新用户列表信息
  67. })
  68. });
  69. console.log("Server running: http://127.0.0.1:3000");//打印控制台