客戶端連接上來后,在沒有超時(shí)的情況下,同一個(gè)客戶端又發(fā)起了一個(gè)連接,如何判斷是否存在舊連接,然后把舊連接踢掉,如果通過循環(huán)判斷,如果客戶端連接有很多的話,在onMessage做這個(gè)循環(huán),感覺不合理,有沒有什么好的方法能實(shí)現(xiàn)
在onWorkerStart里跑timer
http://www.wtbis.cn/doc/workerman/faq/heartbeat.html
是這樣的,心跳30秒,但是客戶端在30秒內(nèi)又發(fā)了一次連接過來,老的連接還沒到30秒心跳條件,所以不會(huì)踢出去,所以如果客戶端再發(fā)次連接過來,就有2個(gè)連接了,所以必須把老的連接踢掉,不然就會(huì)有問題
在三次握手的時(shí)候根據(jù)客戶端分配一個(gè)UUID, 在客戶端首次連接通過驗(yàn)證的時(shí)候把ID添加進(jìn)UUID,在跑timer的時(shí)候去遍歷就可以操作了。
每次連接驗(yàn)證過ID后去檢查UUID里是否存在連接?這個(gè)怎么檢查,onMessage的時(shí)候,才確定設(shè)備編號(hào),3次握手,其實(shí)還不知道設(shè)備編號(hào)是多少,我看了下手冊onConnect時(shí)只能獲取IP和端口,我是覺得再這個(gè)位置去做檢查的,但是感覺做不到
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
}
}
}
是不是可以這樣理解,onMessage里面,就算已經(jīng)連接了的,只要先unset($worker->uidConnections[$connection->uid])連接,再重新$worker->uidConnections[$connection->uid] = $connection;也是可以的