iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 21
1
Modern Web

三十天路邊賭場上線了!系列 第 21

DAY21 伺服器端資料串接

  • 分享至 

  • xImage
  •  

前言

今天來大概架構一下我們伺服器端串接資料的結構吧!

架構

以下是伺服器端的架構,那這篇文重點是在 WsController.js內!

│  .env
│  .gitignore
│  app.js
│  cmd.js
│  cst.js
│  LICENSE
│  package-lock.json
│  package.json
│  preview.png
│  README.md
├─bin
├─db
│      admin.json
│      bets.json
│      lobby.json
│      tables.json
│      users.json
├─errors
├─gameServer
│  │  game.js
│  │  server.js
│  ├─config
│  │      bcr.json
│  │      index.js
│  │      poker.json
│  ├─controllers
│  │      GameController.js
│  │      MainController.js
│  │      WsController.js
│  ├─core
│  │      calcPokerPoint.js
│  │      fanPi.js
│  │      Game.js
│  │      grabRandomPoker.js
│  │      index.js
│  │      preparePoker.js
│  │      shouldBankerSupplyPoker.js
│  │      shouldPlayerSupplyPoker.js
│  │      timeClock.js
│  ├─lib
│  │      $G.js
│  │      $N.js
│  │      $R.js
│  │      dbBet.js
│  │      dbTable.js
│  │      dbUser.js
│  │      index.js
│  ├─middleware
│  │      auth.js
│  ├─mock
│  │      mockio.js
│  │      mockSocket.js
│  ├─models
│  │      index.js
│  │      User.js
│  └─utils
│          calcBetTotal.js
│          calcUserPayout.js
│          combineBet.js
│          ensureNumber.js
│          getRandom.js
│          index.js
│          minusBet.js
│          shallowObject.js
├─test
│      test-game.js
│      test-utils.js
│      userMock.js
└─webServer
    │  server.js
    ├─api
    │      admin_api.js
    │      user_api.js
    ├─middleware
    │      verifyToken.js
    ├─public
    │  ├─admin
    │  │      
    │  ├─game
    │  │              
    │  ├─test
    │  │      
    │  └─user      
    └─src
            adminController.js
            betController.js
            errorController.js
            mailController.js
            userController.js
            utils.js

Websocket Controller

usersSocket

WsController就是Websocket Controller,簡單的直接使用SocketIo,大概解說usersSocket會儲存所有有連線的使用者socket,讓我們想跟使用者溝通時可以知道要把資料送給誰。

initSocket

在初始化Socket時,會將http傳入並產生socket,且有middleware越來辨識使否為使用者,只要能得到game合法socket,就一定是會員。

io = require('socket.io')(http)
io.use(auth)
___socket(io)
}

__rqs function

這function是協助將socket接收到的資料傳送至MainController進行其他複合式的操作。且當MainController resolve時會直接返回emit的reskey,方便我們模擬req、res的感覺。

  const __rqs = (reqkey, reskey, id, data) => {
    MainController.onWs(reqkey, id, data)
      .then(res => socket.emit(reskey, { result: res }))
      .catch(err => socket.emit(reskey, { error: err }))
  }

socket.on(cmd, data)

這就是標準使用rqs,將資料傳送至MainController,且回應是甚麼。

socket.on(cmd.REQ_USER_INFO, data => {
__rqs(cmd.REQ_USER_INFO, cmd.RES_USER_INFO, socket._id, data)
})

完整程式碼

const mockio = require('../mock/mockio')
const cmd = require('../../cmd')
const MainController = require('./MainController')
const auth = require('../middleware/auth')

var WsController = function() {
  var io = null
  var usersSocket = {}

  MainController.initWs(this)

  this.initSocket = function(http) {
    io = require('socket.io')(http)
    io.use(auth)
    ___socket(io)
  }

  this.notifyPeerError = function(id, err) {
    // 省略
  }

  this.notifyPeer = function(id, ntf, cst, data) {
    // 省略
  }
  var ___socket = function(_io) {
    _io.on('connection', function(socket) {
      socket.emit('connect')

      const __rqs = (reqkey, reskey, id, data) => {
        MainController.onWs(reqkey, id, data)
          .then(res => socket.emit(reskey, { result: res }))
          .catch(err => socket.emit(reskey, { error: err }))
      }
     
      usersSocket[socket._id] = socket

      socket.on(cmd.REQ_USER_TB_SITDOWN, data => {
        __rqs(
          cmd.REQ_USER_TB_SITDOWN,
          cmd.RES_USER_TB_SITDOWN,
          socket._id,
          data
        )
      })

      socket.on(cmd.REQ_USER_LOGIN, data => {
        __rqs(cmd.REQ_USER_LOGIN, cmd.RES_USER_LOGIN, socket._id, data)
      })

      socket.on(cmd.REQ_USER_INFO, data => {
        __rqs(cmd.REQ_USER_INFO, cmd.RES_USER_INFO, socket._id, data)
      })

      socket.on(cmd.REQ_USER_BET_INFO, data => {
        __rqs(cmd.REQ_USER_BET_INFO, cmd.RES_USER_BET_INFO, socket._id, data)
      })

      socket.on(cmd.REQ_TB_INFO, data => {
        __rqs(cmd.REQ_TB_INFO, cmd.RES_TB_INFO, socket._id, data)
      })

      socket.on(cmd.REQ_USER_BETOUT, data => {
        __rqs(cmd.REQ_USER_BETOUT, cmd.RES_USER_BETOUT, socket._id, data)
      })

      socket.on('disconnect', socket => {
        __rqs(cmd.REQ_USER_LOGOUT, cmd.RES_USER_LOGOUT, socket._id)
        usersSocket[socket._id] = null
        delete usersSocket[socket._id]
      })
    })
  }
}
module.exports = new WsController()

後記

這就是大概Websocket Controller的樣子,方便我們不要直接接觸socket傳來傳去真的挺麻煩的。

連結

Github 2019-IT30-BCR


上一篇
DAY20 賭場訊息遞送規劃
下一篇
DAY22 遊戲登陸串接
系列文
三十天路邊賭場上線了!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言