国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

GatewayWorker使用兩個(gè)websocket連接session丟失

黑老怪

項(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ù)器,求大佬求救啊!

3824 3 0
3個(gè)回答

walkor 打賞

如果你的session是在onMessage里設(shè)置的,那很可能為空,因?yàn)闀?huì)出現(xiàn)只發(fā)起連接但是還沒(méi)來(lái)得及發(fā)送數(shù)據(jù)連接就斷開的情況。也就是onMessage根本沒(méi)觸發(fā)的情況。
?
請(qǐng)自行記錄下日志就排查,在設(shè)置SESSION的地方記錄日志,包括client_id。獲取的地方也記錄client_id日志。
?

  • 黑老怪 2019-05-14

    我是在websocket連接的時(shí)候設(shè)置Session,然后websocket連接成功后,客戶端會(huì)立即發(fā)送登錄信息給后臺(tái),然后刪除定時(shí)的時(shí)候session就為空
    在onMessage里打印session為空,但是在onConnect里不為空

  • walkor 2019-05-14

    把整體代碼發(fā)出來(lái)吧。

黑老怪

連接觸發(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ā)行為

  • 暫無(wú)評(píng)論
walkor 打賞

估計(jì)你的GatewayWorker版本低了,升級(jí)試下

  • 黑老怪 2019-05-14

    3.5.18的...

  • walkor 2019-05-14

    發(fā)個(gè)能重現(xiàn)問(wèn)題的最精簡(jiǎn)的demo吧。代碼片段看不出什么

年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??