如何使用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); } ?>
文章评论(0)