workerman教程4(新手必看)
今天就来讲讲聊天室框架的event类
先看这个函数
public static function onMessage($client_id, $message)
$client_id这个是服务器和客户端的链接字 任何收发数据都要靠他
不同的客户端 和服务端连接 会有不用的链接字
$message这个是服务端收到的数据
// 如果是websocket握手
if(self::checkHandshake($message))
{
// debug
echo "client:{$_SERVER}:{$_SERVER} gateway:{$_SERVER}:{$_SERVER} client_id:$client_id onMessage:".$message."\n";
return;
}
先握手 这个是websocket协议最基础的东西 连接前先握手
所谓握手我简单的说下 就是客户端发送数据给服务端 服务端收到的数据发给客户端 然后就握手了 一旦握手就代表连接了
如果握手失败就 不会连接
// 解码websocket,得到原始数据
$message =WebSocket::decode($message);
收到的数据要解码哦
$message_data = json_decode($message, true);//解析客户端发过来的数据
//将客户端发过来的房间id放到 变量$room_id
$room_id = $message_data;
//从客户端发过来的昵称放到$client_name
$client_name = htmlspecialchars($message_data);
// 存储到当前房间的客户端列表
$all_clients = self::addClientToRoom($room_id, $client_id, $client_name);
这个就是客户端发过来的房间ID 用户昵称等都存在memcache 我在workerman教程3 说明了 怎么查看里面的数据
// 整理客户端列表以便显示 其实也就是原来的一位数组变成二维数组 提高可读性
$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第二个参数就是写的不同客户端与服务端的链接字的数组 只发送给这些客户端哦~
下面说下私聊
// 私聊
Gateway::sendToClient($message_data, WebSocket::encode(json_encode($new_message)));
这个是发给1个客户端的方法 (比方说你发给11客户端)
$message_data 这个写客户端与服务端连接字
//发给当前客户端 (发给自己)
Gateway::sendToCurrentClient(WebSocket::encode(json_encode($new_message)));
写完了 其他也没什么好说的 还是那句话 有问题直接留言
解释的很好