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

如何判斷同一個(gè)客戶端連接是不是舊連接

test123456

客戶端連接上來后,在沒有超時(shí)的情況下,同一個(gè)客戶端又發(fā)起了一個(gè)連接,如何判斷是否存在舊連接,然后把舊連接踢掉,如果通過循環(huán)判斷,如果客戶端連接有很多的話,在onMessage做這個(gè)循環(huán),感覺不合理,有沒有什么好的方法能實(shí)現(xiàn)

1162 3 1
3個(gè)回答

army
  • test123456 2023-05-15

    是這樣的,心跳30秒,但是客戶端在30秒內(nèi)又發(fā)了一次連接過來,老的連接還沒到30秒心跳條件,所以不會(huì)踢出去,所以如果客戶端再發(fā)次連接過來,就有2個(gè)連接了,所以必須把老的連接踢掉,不然就會(huì)有問題

  • army 2023-05-15

    在三次握手的時(shí)候根據(jù)客戶端分配一個(gè)UUID, 在客戶端首次連接通過驗(yàn)證的時(shí)候把ID添加進(jìn)UUID,在跑timer的時(shí)候去遍歷就可以操作了。

  • test123456 2023-05-15

    現(xiàn)在就是不想去遍歷呀,如果連上來的客戶端有很多,去做遍歷查詢再踢出去,效率太低了

  • army 2023-05-15

    那就在每次連接驗(yàn)證過ID后去檢查UUID里是否存在連接,存在則close,否則添加當(dāng)前ID進(jìn)UUID

  • test123456 2023-05-15

    每次連接驗(yàn)證過ID后去檢查UUID里是否存在連接?這個(gè)怎么檢查,onMessage的時(shí)候,才確定設(shè)備編號(hào),3次握手,其實(shí)還不知道設(shè)備編號(hào)是多少,我看了下手冊onConnect時(shí)只能獲取IP和端口,我是覺得再這個(gè)位置去做檢查的,但是感覺做不到

  • 小W 2023-05-15

    也就是說再次connect時(shí),你要確定出之前這個(gè)客戶端有沒有connect,哪一個(gè)connect

army
private array $linkList = array();
 /**
     * 客戶端連接時(shí)(三次握手)
     * @param TcpConnection $c
     * @param               $httpBuffer
     * @return void
     */
    public function connect(TcpConnection $c, $httpBuffer): void
    {
        if (!in_array($_SERVER['HTTP_ORIGIN'], Army::$Config['ALLOW_ORIGIN'])) {
            $c->close();
        }
        $c->uuid = md5($httpBuffer);
        //向客戶端發(fā)送檢測指令,讓客戶端上傳token等進(jìn)行首次uuid綁定
         .....
    }
   //onMessage
    public function run(TcpConnection $c, $request): void
    {
        //客戶端請求帶上token
        .....
        //驗(yàn)證司機(jī)token為userID
        $driverID = DriverToken::get($driverToken, $sid);
        //將本次連接放入linkList
        if ($driverID > 0 && isset($c->uuid)) {
            if (!isset($this->linkList[$c->uuid][$driverID])) {
                $this->linkList[$c->uuid][$driverID] = $c;//首次
            }else{
               //如果該用戶已經(jīng)連接操作
                $this->linkList[$c->uuid][$driverID]->close(); //關(guān)閉連接
                unset($this->linkList[$c->uuid][$driverID] );//移除
                $this->linkList[$c->uuid][$driverID] = $c;//重新把本次連接放入linkList
            }
        }
   }
  • test123456 2023-05-16

    是不是可以這樣理解,onMessage里面,就算已經(jīng)連接了的,只要先unset($worker->uidConnections[$connection->uid])連接,再重新$worker->uidConnections[$connection->uid] = $connection;也是可以的

  • army 2023-05-18

    不行,unset 只是把映射的uidConnections咔嚓了,實(shí)際連接還是存在的,必須->close()才算關(guān)閉連接。

walkor 打賞

http://www.wtbis.cn/doc/workerman/faq/send-data-to-client.html#WorkerMan%E4%B8%AD%E5%A6%82%E4%BD%95%E5%90%91%E6%9F%90%E4%B8%AA%E7%89%B9%E5%AE%9A%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE

參考手冊例子
判斷是否有舊連接,用isset($worker->uidConnections[$uid])來判斷。這里$uid可以看作是設(shè)備id。

實(shí)際上數(shù)組遍歷也很快,1萬個(gè)元素的數(shù)組遍歷一次也就0.0001秒。

  • 小W 2023-05-16

    同一個(gè)客戶端發(fā)起了兩次連接,得到的uid不一樣吧?

  • walkor 2023-05-16

    uid是客戶端發(fā)給服務(wù)端的,一樣不一樣看客戶端業(yè)務(wù)邏輯。就物聯(lián)網(wǎng)設(shè)備而言,設(shè)備id是不變的,連多少次都是同一個(gè)設(shè)備id

  • 小W 2023-05-16

    所以說onConnect時(shí),無法準(zhǔn)確的檢測出是否是同一個(gè)客戶端

  • 小W 2023-05-16

    只能在onmessage里驗(yàn)證

  • walkor 2023-05-16

    onConnect是tcp三次握手,只能獲取到設(shè)備的出口ip和端口,其它信息獲取不到。如果每臺(tái)設(shè)備的出口ip或者設(shè)備端口不一樣,也可以判斷是不是同一個(gè)客戶端。

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