今天來大概架構一下我們伺服器端串接資料的結構吧!
以下是伺服器端的架構,那這篇文重點是在 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
WsController就是Websocket Controller,簡單的直接使用SocketIo,大概解說usersSocket會儲存所有有連線的使用者socket,讓我們想跟使用者溝通時可以知道要把資料送給誰。
在初始化Socket時,會將http傳入並產生socket,且有middleware越來辨識使否為使用者,只要能得到game合法socket,就一定是會員。
io = require('socket.io')(http)
io.use(auth)
___socket(io)
}
這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 }))
}
這就是標準使用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傳來傳去真的挺麻煩的。