Browse Source

feat:看点socket

徐志豪 5 years ago
parent
commit
aff145b8e3
3 changed files with 78 additions and 41 deletions
  1. 15 19
      server/app.js
  2. 0 2
      server/index.js
  3. 63 20
      server/socketv2.js

+ 15 - 19
server/app.js

@@ -11,6 +11,7 @@ module.exports = class WebSocketServer {
 
   create() {
     this.io = require("socket.io")(server, {
+
       path: "/vr-node",
       serveClient: false,
       // below are engine.IO options
@@ -25,30 +26,23 @@ module.exports = class WebSocketServer {
       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)
+      console.log(user)
+      socket.join(roomId, () => {
+        let roomsPerson = this._roomPerson.get(roomId) || []
+        roomsPerson.push(user)
+        this._roomPerson.set(roomId, roomsPerson)
+        // 只派发非小程序端的socket连接数及其user数据
+        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('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 })
       })
 
 
@@ -60,6 +54,8 @@ module.exports = class WebSocketServer {
         }
       });
 
+      console.log("WebSocket服务端建立完毕");
+
       socket.on("disconnect", (reason) => {
         let roomsPerson = this._roomPerson.get(roomId) || []
         // 断开连接的把roomsPerson中的user去掉
@@ -67,7 +63,7 @@ module.exports = class WebSocketServer {
         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) });
+          console.log("关闭连接", reason);
         }
       });
       socket.on("error", function (reason) {
@@ -83,4 +79,4 @@ module.exports = class WebSocketServer {
     this.server.disconnect(true);
   }
 
-};
+};

+ 0 - 2
server/index.js

@@ -26,8 +26,6 @@ module.exports = class WebSocketServer {
       this._users.push(user)
       let roomId = user['roomId']
       
-      
-      
       // 一个房间只允许存在一个场景码,若场景不对,则改变房间号
       roomId = user['roomId'] + user.scene_num
       let roomsPerson = this._roomPerson.get(roomId) || []

+ 63 - 20
server/socketv2.js

@@ -4,11 +4,13 @@ const EVENT = {
   someOneInRoom: 'someOneInRoom',
   someOneLeaveRoom: 'someOneLeaveRoom',
   startCall: 'startCall',
-  putup: 'putup',
+  stopCall: 'stopCall',
   webSyncAction: 'webSyncAction',
   clientSyncAction: 'clientSyncAction',
   action: 'action',
-  roomClose: 'roomClose'
+  roomClose: 'roomClose',
+  roomIn: 'roomIn',
+  changeVoiceStatus: 'changeVoiceStatus'
 }
 
 module.exports = class WebSocketServer {
@@ -33,39 +35,62 @@ module.exports = class WebSocketServer {
 
     this.io.on("connection", (socket) => {
       let user = socket.handshake.query
-      const { roomId, deviceId, sceneNum, isClient, useId } = user
+      const { roomId, userId, sceneNum, isClient, role } = user
       const webRoomId = `${roomId}${sceneNum}`
-
+      const clientRoom = userId ? `${userId}` : `${sceneNum}${roomId}`
       // 加入客户端与H5单独的通讯房间 
-      socket.join(deviceId)
+      socket.join(clientRoom, () => {
+        console.log('join success', clientRoom, user)
+      })
 
       // 加入所有连接数的通讯房间
       socket.join(roomId, () => {
         // 只有h5才能加入H5端的房间
-        
+        if (!isClient) {
+          let roomsPerson = this._roomPerson.get(roomId) || []
+          roomsPerson.push(user)
+          this._roomPerson.set(roomId, roomsPerson)
+        }
       })
-      if (!isClient) {
-        socket.join(webRoomId, () => {
-          
+      let clientPerson = this._roomPerson.get(clientRoom) || []
+      if (isClient) {   
+        clientPerson.push(user)
+        this._roomPerson.set(clientRoom, clientPerson)
+      } else {
+        clientPerson.forEach(item => {
+          if (item.userId === user.userId) {
+            user.avatar = item.avatar
+            user.voiceStatus = item.voiceStatus
+          }
         })
       }
       
       
       socket.on(EVENT.startCall, () => {
+        console.log('startcall', user)
         if (!isClient) {
-          let roomsPerson = this._roomPerson.get(roomId) || []
-          roomsPerson.push(user)
-          this._roomPerson.set(roomId, roomsPerson)
-          socket.broadcast.to(roomId).emit(EVENT.someOneInRoom, { user, roomsPerson })
+          socket.join(webRoomId, () => {
+            console.log('join webRoom', user)
+            let roomsPerson = this._roomPerson.get(roomId) || []
+            socket.emit(EVENT.roomIn, { roomsPerson })
+            socket.broadcast.to(roomId).emit(EVENT.someOneInRoom, { user, roomsPerson })
+          })
+          
         }
       })
 
-      socket.on(EVENT.putup, () => {
+      socket.on(EVENT.stopCall, () => {
+        socket.leave(roomId)
         if (!isClient) {
+          socket.leave(webRoomId)
+          if (role === 'leader') {
+            socket.broadcast.to(roomId).emit(EVENT.roomClose)
+          }
           let roomsPerson = this._roomPerson.get(roomId) || []
-          roomsPerson = roomsPerson.fliter(item => item.userId !== user.userId)
+          roomsPerson = roomsPerson.filter(item => item.userId !== user.userId)
           this._roomPerson.set(roomId, roomsPerson)
           socket.broadcast.to(roomId).emit(EVENT.someOneLeaveRoom, { user, roomsPerson })
+          
         }
       })
 
@@ -78,18 +103,36 @@ module.exports = class WebSocketServer {
       })
 
       socket.on(EVENT.clientSyncAction, (data) => {
-        socket.broadcast.to(deviceId).emit(EVENT.clientSyncAction, data)
+        console.log('client', clientRoom, data)
+        socket.broadcast.to(clientRoom).emit(EVENT.clientSyncAction, data)
+      })
+
+      socket.on(EVENT.changeVoiceStatus, data => {
+        let _roomPerson = this._roomPerson.get(roomId) || []
+        user.voiceStatus = data.status
+        console.log(_roomPerson, '_roomPerson')
+        _roomPerson.forEach(item => {
+          if (item.userId === user.userId) {
+            item.voiceStatus = user.voiceStatus
+          }
+        })
+        this._roomPerson.set(roomId, _roomPerson)
+        console.log(_roomPerson, data, user)
+        socket.broadcast.to(roomId).emit(EVENT.changeVoiceStatus, {roomsPerson: _roomPerson})
       })
 
       socket.on("disconnect", (reason) => {
+        socket.leave(roomId)
         if (!isClient) {
+          if (role === 'leader') {
+            socket.broadcast.to(roomId).emit(EVENT.roomClose)
+          }
           let roomsPerson = this._roomPerson.get(roomId) || []
-          roomsPerson = roomsPerson.fliter(item => item.userId !== user.userId)
+          roomsPerson = roomsPerson.filter(item => item.userId !== user.userId)
           this._roomPerson.set(roomId, roomsPerson)
           socket.broadcast.to(roomId).emit(EVENT.someOneLeaveRoom, { user, roomsPerson })
-          if (user.isOwner) {
-            socket.broadcast.to(roomId).emit(EVENT.roomClose)
-          }
+          socket.leave(webRoomId)
+          socket.leave(roomId)
         }
       })