項(xiàng)目開了兩個(gè)websocket地址用相同的注冊(cè)地址
192.168.100.96:5858
192.168.100.201:5858
我在websocket的onConnect時(shí)候設(shè)置了認(rèn)證定時(shí)器 (我用的是GlobalTimer)// 連接到來(lái)后,定時(shí)10秒關(guān)閉這個(gè)鏈接,需要10秒內(nèi)發(fā)認(rèn)證并刪除定時(shí)器阻止關(guān)閉連接的執(zhí)行
$auth_timer_id = GlobalTimer::add(2, function () use ($client_id) {
//錯(cuò)誤提示.
//發(fā)送離線提示
Send::sendToClientClose($client_id, 'server', 'Sign', 'auth', 400);
}, null, false);
$_SESSION = $auth_timer_id;
$_SESSION = $client_id;
在message里的接收第一條信息里會(huì)在成功后刪除定時(shí)器,但是$_SESSION會(huì)有時(shí)候?yàn)榭?而且只在多個(gè)websocket同時(shí)連接時(shí)會(huì)發(fā)生,單獨(dú)一個(gè)不會(huì)發(fā)生(我是同時(shí)連接兩個(gè)websocket,一直刷新頁(yè)面就會(huì)出現(xiàn)這個(gè)問(wèn)題)
因?yàn)闃I(yè)務(wù)邏輯以后還會(huì)更多個(gè),甚至5-10個(gè)websocket服務(wù)器,求大佬求救啊!
連接觸發(fā)
public static function onConnect($client_id)
{
try {
// 連接到來(lái)后,定時(shí)10秒關(guān)閉這個(gè)鏈接,需要10秒內(nèi)發(fā)認(rèn)證并刪除定時(shí)器阻止關(guān)閉連接的執(zhí)行
$auth_timer_id = GlobalTimer::add(2, function () use ($client_id) {
//錯(cuò)誤提示.
//發(fā)送離線提示
Send::sendToClientClose($client_id, 'server', 'Sign', 'auth', 400);
}, null, false);
$_SESSION = $auth_timer_id;
$_SESSION = $client_id;
} catch (Throwable $e) {
//錯(cuò)誤日志記錄
Other::ErrorLog('Events', 'onConnect', $e);
//workerman記錄錯(cuò)誤
\GatewayWorker\Gateway::log($e);
}
}
連接后客戶端發(fā)送第一條消息就會(huì)出現(xiàn)空,如果我在客戶端連接后延遲100毫秒就不會(huì)出現(xiàn),或者只使用一個(gè)websocket連接也不會(huì)出現(xiàn)
public static function onMessage($client_id, $message)
{
if ($_SESSION === null) {
$_SESSION = $client_id;
}
Route::index($client_id, $message);
}```
**環(huán)境:**
兩個(gè)websocket服務(wù)器
2個(gè)BusinessWorker進(jìn)程?第一個(gè)為定時(shí)器第二個(gè)為業(yè)務(wù)邏輯
客戶端為node.js?業(yè)務(wù)邏輯為
打開窗口會(huì)在nodejs后臺(tái)生成ws連接
```js
const express = require('express');
const router = express.Router();
const request = require('request');
const webSocket = require("ws");
/* GET home page. */
router.get('/', function (req, res, next) {
request({
url: "http://poker3.freepks.com/robotGameData",
method: "POST",
json: true,
headers: {
"content-type": "application/json",
},
body: {id: '100000035'}
}, function (error, response, body) {
res.end(JSON.stringify(body));
if (body.code === 200) {
webSocketF(body.address, 1)
}
});
});
function webSocketF(address, roomId) {
let ws = [];
let msgId = 1;
for (let a = 0; a < address.length; a++) {
const websocketUrl = "ws://" + address.url;
const token = address.token;
ws = new webSocket(websocketUrl);
ws.on("open", function () {
// console.log(a);
ws.send('{"type":"client","class":"Sign","method":"in","site":"web","msgId":"1","data":{"token":"' + token + '"}}')
});
ws.on("error", function (err) {
console.log("error: ", err);
});
ws.on("close", function () {
console.log(a);
// console.log(ws.length);
});
ws.on("message", function (data) {
msgId++;
data = JSON.parse(data);
route(ws, data, msgId, roomId);
});
}
}
function route(ws, data, msgId, roomId) {
if (msgId === 2) {
console.log(ws.length);
//發(fā)送給游戲加入房間
for (let a = 0; a < ws.length; a++) {
ws.send('{"type":"client","class":"Room","method":"join","site":"hall","msgId":"2","data":{"roomId":' + roomId + '}}')
}
}
}
module.exports = router;
這是為了寫游戲機(jī)器人?所以會(huì)模擬用戶觸發(fā)行為