PHP实现swoole websocket连接,并推送json大数据

2024-05-30   阅读:393   类型:后端   分类:swoole    标签: PHP swoole

如何使用PHP连接websocket推送数据,本文介绍发送json数据过程遇到的无法发送问题,并解决数据多的情况出现无法推送问题,供大家参考和使用:直接上代码

<?php
public function message(){
    // WebSocket 客户端代码
    $host = '127.0.52.330'; // 你的 WebSocket 服务器主机
    $port = 9502; // 你的 WebSocket 服务器端口

    // 创建一个 TCP/IP 套接字
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

    // 连接到 WebSocket 服务器
    if ($socket === false || !socket_connect($socket, $host, $port)) {
      echo "连接到 WebSocket 服务器失败";
      exit;
    }

    // WebSocket 握手
    $secKey = base64_encode(random_bytes(16)); // 生成一个随机密钥用于握手
    $upgradeHeader = "GET / HTTP/1.1\r\n" .
      "Host: $host:$port\r\n" .
      "Upgrade: websocket\r\n" .
      "Connection: Upgrade\r\n" .
      "Sec-WebSocket-Key: $secKey\r\n" .
      "Sec-WebSocket-Version: 13\r\n\r\n";
    // 发送握手请求到服务器
    socket_write($socket, $upgradeHeader);
    // 读取服务器的响应(应该是一个 WebSocket 握手响应)
    $response = socket_read($socket, 2048);
    // 要发送的数据
    $data = json_encode([
      'userId' => 11,
      'yy_tel' => 123456788,
      'yy_name' => '比你好',
      'pro_id' => 1,
      'earId' => 22,
      'cateId' => 11,
      'appointment_date' => '2024-05-12',
      'appointment_time' => '15:00',
      'status' => 0,
      'created_time' => time(),
    ]);
    // 构造 WebSocket 帧
    $frame = "\x81"; // FIN + 文本数据帧(10000001)
    $length = strlen($data);
    if ($length <= 125) {
      $frame .= chr($length);
    } elseif ($length <= 65535) {
      $frame .= chr(126) . pack("n", $length);
    } else {
      $frame .= chr(127) . pack("NN", 0, $length);
    }
    $frame .= $data;
    // 发送数据帧到服务器
    $bytesSent = socket_write($socket, $frame);
    // 检查数据是否成功发送
    if ($bytesSent === false) {
      echo "发送数据到服务器失败";
    } elseif ($bytesSent < strlen($frame)) {
      echo "数据发送到服务器不完整";
    } else {
      echo "数据成功发送到服务器";
    }
    // 关闭套接字连接
    socket_close($socket);

  }
?>

遇到的问题:网上找了很多方法,json数据一多会出现乱码,关键采用一下这部分代码可以解决改问题

<?php
// 构造 WebSocket 帧
    $frame = "\x81"; // FIN + 文本数据帧(10000001)
    $length = strlen($data);
    if ($length <= 125) {
      $frame .= chr($length);
    } elseif ($length <= 65535) {
      $frame .= chr(126) . pack("n", $length);
    } else {
      $frame .= chr(127) . pack("NN", 0, $length);
    }
?>
腾讯云11.11上云拼团Go,2核2G3M云服务器 28元/年

‘简忆博客’微信公众号 扫码关注‘简忆博客’微信公众号,获取最新文章动态
转载:请说明文章出处“来源简忆博客”。http://tpxhm.com/adetail/1052.html

×
觉得文章有用就打赏一下文章作者
微信扫一扫打赏 微信扫一扫打赏
支付宝扫一扫打赏 支付宝扫一扫打赏

文章评论(0)

登录
简忆博客壁纸一
简忆博客壁纸二
简忆博客壁纸三
简忆博客壁纸四
简忆博客壁纸五
简忆博客壁纸六
简忆博客壁纸七
简忆博客壁纸八
头像

简忆博客
勤于学习,乐于分享

置顶推荐

打赏本站

如果你觉得本站很棒,可以通过扫码支付打赏哦!
微信扫码:你说多少就多少~
微信扫码
支付宝扫码:你说多少就多少~
支付宝扫码
×