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) const roomId = user['roomId'] const client_room = `${roomId}_client` let roomsPerson = this._roomPerson.get(roomId) || [] socket.join(client_room); // 一个房间只允许存在一个场景码 if (!user['isClient'] && roomsPerson.filter(item => item.scene_num !== user.scene_num).length === 0) { 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) }); this.io.to(client_room).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient) }); }); } 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) { this.io.to(roomId).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) }); this.io.to(client_room).emit('vr_request', { persons: roomsPerson.filter(item => !item.isClient) }); } }); socket.on("error", function (reason) { console.log("异常关闭", reason) }); return this; }) } close() { this.server.disconnect(true); } };