case 'login':
// 判斷是否有房間號
if(!isset($message_data['room_id']))
{
throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:$message");
}
// 把房間號昵稱放到session中
$room_id = $message_data['room_id'];
$client_name = htmlspecialchars($message_data['client_name']);
$_SESSION['room_id'] = $room_id;
$_SESSION['client_name'] = $client_name;
// 獲取房間內(nèi)所有用戶列表
$clients_list = Gateway::getClientSessionsByGroup($room_id);
foreach($clients_list as $tmp_client_id=>$item)
{
//如果有重名的用戶,通知對方退出并刪除列表
if($item['client_name']==$client_name){
self::onClose($tmp_client_id);
unset($clients_list[$tmp_client_id]);
continue;
}
$clients_list[$tmp_client_id] = $item['client_name'];
}
$clients_list[$client_id] = $client_name;
// 轉(zhuǎn)播給當(dāng)前房間的所有客戶端,xx進(jìn)入聊天室 message {type:login, client_id:xx, name:xx}
$new_message = array('type'=>$message_data['type'], 'client_id'=>$client_id, 'client_name'=>htmlspecialchars($client_name), 'time'=>date('Y-m-d H:i:s'));
Gateway::sendToGroup($room_id, json_encode($new_message));
Gateway::joinGroup($client_id, $room_id);
// 給當(dāng)前用戶發(fā)送用戶列表
$new_message['client_list'] = $clients_list;
Gateway::sendToCurrentClient(json_encode($new_message));
return;
self::onClose($tmp_client_id);
調(diào)用onClose方法,可以通知對方logout,但是client_id依然存在,對方刷新以后會有多個client_id,造成兩方無法聊天,請大神看一下這是怎么回事
onClose 方法是發(fā)生連接關(guān)閉事件自動觸發(fā)的方法,并不是主動關(guān)閉連接的接口。使用gatewayWorker請先閱讀文檔。
Gateway::closeClient($tmp_client_id);
用了closeClient方法,順便跟大神說一下workerman-chat聊天室也有這個bug,斷線重連的話會生成相同名稱的client_id,手機(jī)切換網(wǎng)絡(luò)很短的斷線重連時(shí)間就會出現(xiàn)這種問題