index.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. var server = require("http").createServer();
  2. module.exports = class WebSocketServer {
  3. constructor() {
  4. this._pageMap = new Map();
  5. this._roomIDS = new Map();
  6. this._roomPerson = new Map()
  7. this._users = [];
  8. }
  9. create() {
  10. this.io = require("socket.io")(server, {
  11. path: "/vr-node",
  12. serveClient: false,
  13. // below are engine.IO options
  14. pingInterval: 10000,
  15. pingTimeout: 5000,
  16. cookie: false,
  17. });
  18. server.listen(3000, { origins: "*" });
  19. this.io.on("connection", (socket) => {
  20. let user = socket.handshake.query
  21. this._users.push(user)
  22. let roomId = user['roomId']
  23. // 一个房间只允许存在一个场景码,若场景不对,则改变房间号
  24. roomId = user['roomId'] + user.scene_num
  25. let roomsPerson = this._roomPerson.get(roomId) || []
  26. const client_room = user['roomId']
  27. socket.join(client_room);
  28. if (!user['isClient']) {
  29. socket.join(roomId, () => {
  30. roomsPerson.push(user)
  31. this._roomPerson.set(roomId, roomsPerson)
  32. // 只派发非小程序端的socket连接数及其user数据
  33. console.log(user.scene_num, user.role)
  34. this.io.to(roomId).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient && item.scene_num === user.scene_num) });
  35. this.io.to(client_room).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient && item.scene_num === user.scene_num) });
  36. });
  37. }
  38. socket.on('startCall', () => {
  39. socket.broadcast.to(roomId).emit('answer', { user })
  40. socket.broadcast.to(client_room).emit('answer', { user })
  41. })
  42. socket.on('stopCall', () => {
  43. socket.broadcast.to(roomId).emit('putup', { user })
  44. socket.broadcast.to(client_room).emit('putup', { user })
  45. })
  46. socket.on("getJson", (data) => {
  47. if (roomId) {
  48. if (data.content.action) {
  49. this.io.to(roomId).emit("action", data.content.action);
  50. socket.broadcast.to(client_room).emit('action', data.content.action)
  51. }
  52. this.io.to(roomId).emit("vr_response", data);
  53. }
  54. });
  55. socket.on("disconnect", (reason) => {
  56. let roomsPerson = this._roomPerson.get(roomId) || []
  57. // 断开连接的把roomsPerson中的user去掉
  58. roomsPerson = roomsPerson.filter(item => item !== user)
  59. this._roomPerson.set(roomId, roomsPerson)
  60. if (!user.isClient) {
  61. this.io.to(roomId).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient && item.scene_num === user.scene_num) });
  62. this.io.to(client_room).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient && item.scene_num === user.scene_num) });
  63. }
  64. });
  65. socket.on("error", function (reason) {
  66. console.log("异常关闭", reason)
  67. });
  68. return this;
  69. })
  70. }
  71. close() {
  72. this.server.disconnect(true);
  73. }
  74. };