فهرست منبع

docs:更新文档,法狮龙加注释

unknown 4 سال پیش
والد
کامیت
d637f191e0
4فایلهای تغییر یافته به همراه64 افزوده شده و 254 حذف شده
  1. 46 0
      readme.md
  2. 18 17
      server/fashilong.js
  3. 0 231
      socketv2.js
  4. 0 6
      utils/getUserSig.js

+ 46 - 0
readme.md

@@ -0,0 +1,46 @@
+# socket同屏服务
+
+## 技术栈
+node、socketio
+
+## 项目目录结构
+
+    |-- config                              // 存储腾讯trtc的相关密钥和appid 
+    |-- server                              // 各个服务的父目录
+        |-- app.js                              // 貌似没什么用,志广之前调试用的?
+        |-- fashilong.js                        // 法狮龙的服务
+        |-- index.js                            // 看房的服务
+        |-- socketv2.js                         // 看店的服务
+        |-- zhuisu.js                           // 追溯的服务
+    |-- fashilong.js                        // 法狮龙服务入口,pm2启动       
+    |-- index.js                            // 看房服务入口,pm2启动
+    |-- indexv2.js                          // 看店服务入口,pm2启动
+    |-- zhuisu.js                           // 追溯服务入口,pm2启动
+
+## 开发调试
+### 方式一
+- 起服务
+- 让对应的小程序和h5来连接你本地的服务
+
+### 方式二
+- 改代码,放到测试环境
+- 重启服务,看日志
+
+## 发布测试环境
+- FTP上传代码,路径:/测试服务器-120.25.146.52/root/user/node/wechatIM
+- 重启对应的服务
+
+## 生产环境部署
+- FTP上传代码 路径:/阿里云-看房/root/user/node/vrhouse-node-socket
+- 重启对应的服务
+
+# 服务连接参数部分讲解
+
+## 法狮龙
+重要属性:
+- roomType: 若没有,则默认多人房间,若传'1v1',则创建两人房间
+- isClient: 判断是否h5网页,而非小程序或者中间页,用来广播同屏的数据
+- roomId: 房间号,一般是唯一的
+- voiceStatus:是否静音
+- role: 角色 leader则为房主
+- userLimitNum: 房间上限人数

+ 18 - 17
server/fashilong.js

@@ -9,19 +9,19 @@ function getSig (userId) {
 }
 
 const EVENT = {
-  someOneInRoom: 'someOneInRoom',
-  someOneLeaveRoom: 'someOneLeaveRoom',
-  startCall: 'startCall',
-  stopCall: 'stopCall',
-  webSyncAction: 'webSyncAction',
-  clientSyncAction: 'clientSyncAction',
-  action: 'action',
-  roomClose: 'roomClose',
-  roomIn: 'roomIn',
-  changeVoiceStatus: 'changeVoiceStatus',
-  changeOnlineStatus: 'changeOnlineStatus',
-  roomPersonChange: 'roomPersonChange',
-  changeRoomEnableTalk: 'changeRoomEnableTalk'
+  someOneInRoom: 'someOneInRoom',   // 有人进入房间
+  someOneLeaveRoom: 'someOneLeaveRoom', // 有人离开房间
+  startCall: 'startCall',           // 开始通话
+  stopCall: 'stopCall',             // 结束通话
+  webSyncAction: 'webSyncAction',   // 通知h5的事件
+  clientSyncAction: 'clientSyncAction', // 通知非H5的事件
+  action: 'action',                 // 通知所有连接设备的事件
+  roomClose: 'roomClose',           // 房间已结束/房主已离开
+  roomIn: 'roomIn',                 // 通知设备成功进入房间
+  changeVoiceStatus: 'changeVoiceStatus', // 通知某设备语音状态
+  changeOnlineStatus: 'changeOnlineStatus', // 通知某设备的在线状态
+  roomPersonChange: 'roomPersonChange',   // 房间人数变化事件
+  changeRoomEnableTalk: 'changeRoomEnableTalk'  // 改变房间是否可通话的配置
 }
 
 const CODEMAP = {
@@ -83,7 +83,6 @@ module.exports = class WebSocketServer {
       }
 
       // 1v1保存房主
-      
       if (roomType === '1v1' && !this._roomsConfig[roomId]) {
         console.log(roomType, roomId, user)
         this._roomsConfig[roomId] = {
@@ -108,9 +107,8 @@ module.exports = class WebSocketServer {
         is1v1 = this._roomsConfig[roomId].leaderId === userId
       }
       console.log(this._roomsConfig[roomId], userId, !is1v1, user.role !== LEADER, (this._roomPerson.get(roomId) && !this._roomPerson.get(roomId).find(item => item.role === LEADER)))
-      // 若已结束、房间已关闭
+      // 非房主进来房间,判断房间是否存在,以及房间内是否有房主,若无则通知房间已关闭
       if (!is1v1 && user.role !== LEADER && ((this._roomPerson.get(roomId) && !this._roomPerson.get(roomId).find(item => item.role === LEADER)) || (!this._roomPerson.get(roomId)))) {
-        console.log('roomClose')
         setTimeout(() => {
           socket.emit(EVENT.roomClose, { code: 3001, msg: CODEMAP[3001]})
         }, 1000)
@@ -155,11 +153,13 @@ module.exports = class WebSocketServer {
 
         })
       }
+      // 开始通话
       socket.on(EVENT.startCall, () => {
         if (!isClient) {
           let roomsPerson = this._roomPerson.get(roomId) || []
-          
+          // 返回h5房间内的信息
           socket.emit(EVENT.roomIn, { user, roomsPerson: sortRoomUser(roomsPerson), roomsConfig: this._roomsConfig[roomId]})
+          // 判断是否某些情况断线重连
           if (!user.isInRoom) {
             socket.broadcast.to(roomId).emit(EVENT.someOneInRoom, { user, roomsPerson: sortRoomUser(roomsPerson) })
           }
@@ -246,6 +246,7 @@ function removeRoomUser (roomsPerson, user) {
   return roomsPerson
 }
 
+// 过滤房间内相同的人
 function sortRoomUser (roomsPerson) {
   if (!roomsPerson) return []
   const res = new Map()

+ 0 - 231
socketv2.js

@@ -1,231 +0,0 @@
-var server = require("http").createServer();
-const TLSSigAPIv2 = require('tls-sig-api-v2')
-const appids = require('./../config/appid')
-const api = new TLSSigAPIv2.Api(appids.shop.appid, appids.shop.key)
-
-function getSig (userId) {
-  return api.genSig(userId, 86400)
-}
-
-const EVENT = {
-  someOneInRoom: 'someOneInRoom',
-  someOneLeaveRoom: 'someOneLeaveRoom',
-  startCall: 'startCall',
-  stopCall: 'stopCall',
-  webSyncAction: 'webSyncAction',
-  clientSyncAction: 'clientSyncAction',
-  action: 'action',
-  roomClose: 'roomClose',
-  roomIn: 'roomIn',
-  changeVoiceStatus: 'changeVoiceStatus',
-  changeOnlineStatus: 'changeOnlineStatus',
-  roomPersonChange: 'roomPersonChange'
-}
-
-const CODEMAP = {
-  3001: '房间已被解散',
-  3002: '房主主动解散'
-}
-
-module.exports = class WebSocketServer {
-  constructor() {
-    this._pageMap = new Map();
-    this._roomIDS = new Map();
-    this._roomPerson = new Map()
-
-  }
-
-  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(3030, { origins: "*" });
-
-    this.io.on("connection", (socket) => {
-      let user = socket.handshake.query
-      const { roomId, userId, sceneNum, isClient, role, userLimitNum } = user
-      const webRoomId = `${roomId}_${sceneNum}_web`
-      const clientRoom = `${userId}${roomId}`
-      console.log(user, 'connection')
-      // 加入客户端与H5单独的通讯房间 
-      socket.join(clientRoom, () => {
-      })
-      socket.on(EVENT.clientSyncAction, (data) => {
-        console.log(data,'clientSyncAction')
-        socket.broadcast.to(clientRoom).emit(EVENT.clientSyncAction, data)
-      })
-
-      socket.on(EVENT.changeVoiceStatus, data => {
-        let _roomPerson = this._roomPerson.get(roomId) || []
-        user.voiceStatus = data.status
-        _roomPerson.forEach(item => {
-          if (item.userId === user.userId) {
-            item.voiceStatus = user.voiceStatus
-          }
-        })
-        this._roomPerson.set(roomId, _roomPerson)
-        socket.broadcast.to(roomId).emit(EVENT.changeVoiceStatus, {roomsPerson: sortRoomUser(_roomPerson)})
-      })
-      
-      // 若有房间人数限制
-      if (userLimitNum && this._roomPerson.get(roomId) && sortRoomUser(this._roomPerson.get(roomId)).length >= userLimitNum) {
-        // console.log(this._roomPerson.get(roomId), 'full')
-        // console.log(this._roomPerson.get(roomId).length, userLimitNum,  'full')
-        setTimeout(() => {
-          socket.emit('roomInFail', { type: 'full', msg: '房间人数已满' })
-        }, 1000)
-        return this
-      }
-
-      // 若已结束、房间已关闭
-      if ( user.role !== 'leader'&& ((this._roomPerson.get(roomId) && !this._roomPerson.get(roomId).find(item => item.role === 'leader')) || (!this._roomPerson.get(roomId)))) {
-        console.log('roomClose')
-        setTimeout(() => {
-          socket.emit(EVENT.roomClose, { code: 3001, msg: CODEMAP[3001]})
-        }, 1000)
-        return this
-      }
-
-      // 加入所有连接数的通讯房间
-      socket.join(roomId, () => {
-        // 只有h5才能加入H5端的房间
-        if (!isClient) {
-          let roomsPerson = this._roomPerson.get(roomId) || []
-          if (userId) {
-            user.sig = getSig(userId)
-          }
-          let clientPerson = this._roomPerson.get(clientRoom) || []
-          clientPerson.forEach(item => {
-            if (item.userId === user.userId && item.avatar) {
-              user.avatar = item.avatar
-              user.voiceStatus = item.voiceStatus
-              user.onlineStatus = item.onlineStatus
-              user.nickname = decodeURIComponent(item.nickname)
-            }
-          })
-          roomsPerson.push(user)
-          this._roomPerson.set(roomId, roomsPerson)
-        }
-      })
-      let clientPerson = this._roomPerson.get(clientRoom) || []
-      if (isClient) {   
-        clientPerson.push(user)
-        this._roomPerson.set(clientRoom, clientPerson)
-      }
-      
-      if (!isClient) {
-        socket.join(webRoomId, () => {
-          // let roomsPerson = this._roomPerson.get(roomId) || []
-          // socket.broadcast.to(roomId).emit(EVENT.someOneInRoom, { user, roomsPerson: sortRoomUser(roomsPerson) })
-
-        })
-      }
-      socket.on(EVENT.startCall, () => {
-        if (!isClient) {
-          let roomsPerson = this._roomPerson.get(roomId) || []
-          console.log('startCall', sortRoomUser(roomsPerson) )
-          socket.emit(EVENT.roomIn, { roomsPerson: sortRoomUser(roomsPerson) })
-          socket.broadcast.to(roomId).emit(EVENT.someOneInRoom, { user, roomsPerson: sortRoomUser(roomsPerson) })
-        }
-      })
-
-      socket.on(EVENT.changeOnlineStatus, data => {
-        user.onlineStatus = data.status
-        let roomPerson = this._roomPerson.get(roomId)
-        let __roomPerson = updateRoomUser(roomPerson, user)
-        let actionName = user.onlineStatus ? 'inRoom' : 'leaveRoom'
-        console.log({roomsPerson: sortRoomUser(__roomPerson), actionName})
-        socket.broadcast.to(roomId).emit(EVENT.roomPersonChange, {roomsPerson: sortRoomUser(__roomPerson), actionName, user})
-      })
-
-      socket.on(EVENT.stopCall, () => {
-        socket.leave(roomId)
-        if (role === 'leader') {
-          socket.broadcast.to(roomId).emit(EVENT.roomClose, { code: 3002, msg: CODEMAP[3002]})
-        }
-        let roomsPerson = this._roomPerson.get(roomId) || []
-        roomsPerson = removeRoomUser(roomsPerson, user)
-        this._roomPerson.set(roomId, roomsPerson)
-        socket.broadcast.to(roomId).emit(EVENT.someOneLeaveRoom, { user, roomsPerson: sortRoomUser(roomsPerson) })
-      })
-
-      socket.on(EVENT.webSyncAction, (data) => {
-        socket.broadcast.to(webRoomId).emit(EVENT.webSyncAction, data)
-      })
-
-      socket.on(EVENT.action, (data) => {
-        console.log(data,'action')
-        socket.broadcast.to(roomId).emit(EVENT.action, data)
-      })
-
-      socket.on("disconnect", (reason) => {
-        socket.leave(roomId)
-        if (!isClient) {
-          // if (role === 'leader' && reason !== 'ping timeout') {
-          //   socket.broadcast.to(roomId).emit(EVENT.roomClose)
-          // }
-          let roomsPerson = this._roomPerson.get(roomId) || []
-          roomsPerson = removeRoomUser(roomsPerson, user)
-          this._roomPerson.set(roomId, roomsPerson)
-          // socket.broadcast.to(roomId).emit(EVENT.someOneLeaveRoom, { user, roomsPerson })
-          socket.leave(webRoomId)
-          socket.leave(roomId)
-        }
-      })
-
-      socket.on('reconnect', () => {
-        socket.join(roomId)
-        if (!isClient) {
-          let roomsPerson = this._roomPerson.get(roomId) || []
-          roomsPerson.push(user)
-          this._roomPerson.set(roomId, roomsPerson)
-          socket.join(webRoomId)
-          socket.join(roomId)
-        }
-      })
-
-      socket.on("error", function (reason) {
-        console.log("异常关闭", reason)
-      })
-      return this;
-
-    })
-
-  }
-
-  close() {
-    this.server.disconnect(true);
-  }
-
-};
-
-function removeRoomUser (roomsPerson, user) {
-  for (let i = 0; i < roomsPerson.length; i++) {
-    if (roomsPerson[i].userId === user.userId) {
-      roomsPerson.splice(i, 1)
-    }
-  }
-  return roomsPerson
-}
-
-function sortRoomUser (roomsPerson) {
-  if (!roomsPerson) return []
-  const res = new Map()
-  return roomsPerson.filter((a) => !res.has(a.userId) && res.set(a.userId, 1))
-}
-
-function updateRoomUser (roomsPerson, user) {
-  if (!roomsPerson) return []
-  roomsPerson.forEach(item => {
-    console.log(item.userId === user.userId)
-    if (item.userId === user.userId) {
-      item = Object.assign(item, user)
-    }
-  })
-  return roomsPerson
-}

+ 0 - 6
utils/getUserSig.js

@@ -1,6 +0,0 @@
-const TLSSigAPIv2 = require('tls-sig-api-v2')
-const key = '15e3168d4f89726055fafea9eaf95c0059e2ed4ada2452a512705533b6ba84af'
-const sdkAppId = '1400393268'
-const api = new TLSSigAPIv2.Api(sdkAppId, key)
-
-module.exports = api