workerman教程4(新手必看)
今天就來(lái)講講聊天室框架的event類(lèi)
先看這個(gè)函數(shù)
public static function onMessage($client_id, $message)
$client_id這個(gè)是服務(wù)器和客戶(hù)端的鏈接字 任何收發(fā)數(shù)據(jù)都要靠他
不同的客戶(hù)端 和服務(wù)端連接 會(huì)有不用的鏈接字
$message這個(gè)是服務(wù)端收到的數(shù)據(jù)
// 如果是websocket握手
if(self::checkHandshake($message))
{
// debug
echo "client:{$_SERVER}:{$_SERVER} gateway:{$_SERVER}:{$_SERVER} client_id:$client_id onMessage:".$message."\n";
return;
}
先握手 這個(gè)是websocket協(xié)議最基礎(chǔ)的東西 連接前先握手
所謂握手我簡(jiǎn)單的說(shuō)下 就是客戶(hù)端發(fā)送數(shù)據(jù)給服務(wù)端 服務(wù)端收到的數(shù)據(jù)發(fā)給客戶(hù)端 然后就握手了 一旦握手就代表連接了
如果握手失敗就 不會(huì)連接
// 解碼websocket,得到原始數(shù)據(jù)
$message =WebSocket::decode($message);
收到的數(shù)據(jù)要解碼哦
$message_data = json_decode($message, true);//解析客戶(hù)端發(fā)過(guò)來(lái)的數(shù)據(jù)
//將客戶(hù)端發(fā)過(guò)來(lái)的房間id放到 變量$room_id
$room_id = $message_data;
//從客戶(hù)端發(fā)過(guò)來(lái)的昵稱(chēng)放到$client_name
$client_name = htmlspecialchars($message_data);
// 存儲(chǔ)到當(dāng)前房間的客戶(hù)端列表
$all_clients = self::addClientToRoom($room_id, $client_id, $client_name);
這個(gè)就是客戶(hù)端發(fā)過(guò)來(lái)的房間ID 用戶(hù)昵稱(chēng)等都存在memcache 我在workerman教程3 說(shuō)明了 怎么查看里面的數(shù)據(jù)
// 整理客戶(hù)端列表以便顯示 其實(shí)也就是原來(lái)的一位數(shù)組變成二維數(shù)組 提高可讀性
$client_list = self::formatClientsData($all_clients);
$new_message = array('type'=>$message_data, 'client_id'=>$client_id, 'client_name'=>htmlspecialchars($client_name), 'client_list'=>$client_list, 'time'=>date('Y-m-d H:i:s'));
$client_id_array = array_keys($all_clients);
Gateway::sendToAll(WebSocket::encode(json_encode($new_message)), $client_id_array);
Gateway::sendToAll第二個(gè)參數(shù)就是寫(xiě)的不同客戶(hù)端與服務(wù)端的鏈接字的數(shù)組 只發(fā)送給這些客戶(hù)端哦~
下面說(shuō)下私聊
// 私聊
Gateway::sendToClient($message_data, WebSocket::encode(json_encode($new_message)));
這個(gè)是發(fā)給1個(gè)客戶(hù)端的方法 (比方說(shuō)你發(fā)給11客戶(hù)端)
$message_data 這個(gè)寫(xiě)客戶(hù)端與服務(wù)端連接字
//發(fā)給當(dāng)前客戶(hù)端 (發(fā)給自己)
Gateway::sendToCurrentClient(WebSocket::encode(json_encode($new_message)));
寫(xiě)完了 其他也沒(méi)什么好說(shuō)的 還是那句話 有問(wèn)題直接留言