workerman教程4(新手必看)

a6965921

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)));

写完了 其他也没什么好说的 还是那句话 有问题直接留言

6568 1 0
1个回答

walkor

解释的很好

  • 暂无评论
年代过于久远,无法发表回答
🔝