var server = require("http").createServer(); module.exports = class WebSocketServer { constructor() { this._pageMap = new Map(); this._roomIDS = new Map(); this._roomPerson = new Map() this._users = []; } create() { this.io = require("socket.io")(server, { path: "/vr-node", serveClient: false, // below are engine.IO options pingInterval: 10000, pingTimeout: 5000, cookie: false, }); server.listen(3000, { origins: "*" }); this.io.on("connection", (socket) => { let user = socket.handshake.query this._users.push(user) let roomId = user['roomId'] // 一个房间只允许存在一个场景码,若场景不对,则改变房间号 roomId = user['roomId'] + user.scene_num let roomsPerson = this._roomPerson.get(roomId) || [] const client_room = user['roomId'] socket.join(client_room); if (!user['isClient']) { socket.join(roomId, () => { roomsPerson.push(user) this._roomPerson.set(roomId, roomsPerson) // 只派发非小程序端的socket连接数及其user数据 console.log(user.scene_num, user.role) this.io.to(roomId).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient && item.scene_num === user.scene_num) }); this.io.to(client_room).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient && item.scene_num === user.scene_num) }); }); } socket.on('startCall', () => { socket.broadcast.to(roomId).emit('answer', { user }) socket.broadcast.to(client_room).emit('answer', { user }) }) socket.on('stopCall', () => { socket.broadcast.to(roomId).emit('putup', { user }) socket.broadcast.to(client_room).emit('putup', { user }) }) socket.on("getJson", (data) => { if (roomId) { if (data.content.action) { this.io.to(roomId).emit("action", data.content.action); socket.broadcast.to(client_room).emit('action', data.content.action) } this.io.to(roomId).emit("vr_response", data); } }); socket.on("disconnect", (reason) => { let roomsPerson = this._roomPerson.get(roomId) || [] // 断开连接的把roomsPerson中的user去掉 roomsPerson = roomsPerson.filter(item => item !== user) this._roomPerson.set(roomId, roomsPerson) if (!user.isClient) { this.io.to(roomId).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient && item.scene_num === user.scene_num) }); this.io.to(client_room).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient && item.scene_num === user.scene_num) }); } }); socket.on("error", function (reason) { console.log("异常关闭", reason) }); return this; }) } close() { this.server.disconnect(true); } };