php使用webSocket实现Echarts长连接自动刷新的解决方案(2):后端服务端代码返回json数据

简介: php使用webSocket实现Echarts长连接自动刷新的解决方案(2):后端服务端代码返回json数据

websocket.php后端的设置:

  1. php.ini需要开启sockets扩展;
  2. websocket需要CLI(命令行工具)启动服务端文件服务:php websocket.php


  1. websocket.php代码
$address = "127.0.0.1";
$port = 9090; //调试的时候,可以多换端口来测试程序!
set_time_limit(0);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_block($sock);
socket_bind($sock, $address, $port);
socket_listen($sock, 4);
do {
    echo "Waiting for Connection...\n";
    $msgsock = socket_accept($sock);
    echo "Waiting for Request...\n";
    $buf = socket_read($msgsock, 8192);//读取请求
    echo "Request Received: $buf\n";
    $response = hand_shake($buf);
    socket_write($msgsock, $response, strlen($response)); //发送响应
    //开始通信...
    $buf = socket_read($msgsock, 8192); //获取前端发送的消息
    //返回json数据;
    if (unmask($buf) == 'getPeerInfo') {
        $msg = '[
        {
            "vid": "1",
            "vname": "杨过",
            "vdata": "20.00",
            "vtask": "70.00"
        },
        {
            "vid": "2",
            "vname": "小龙女",
            "vdata": "40.00",
            "vtask": "100.00"
        },
        {
            "vid": "3",
            "vname": "郭靖",
            "vdata": "40.00",
            "vtask": "100.00"
        },
        {
            "vid": "4",
            "vname": "黄蓉",
            "vdata": "30.00",
            "vtask": "100.00"
        },
        {
            "vid": "5",
            "vname": "欧阳锋",
            "vdata": "90.00",
            "vtask": "100.00"
        },
        {
            "vid": "6",
            "vname": "洪七公",
            "vdata": "90.00",
            "vtask": "100.00"
        },
        {
            "vid": "7",
            "vname": "黄老邪",
            "vdata": "68.00",
            "vtask": "90.00"
        },
        {
            "vid": "8",
            "vname": "一灯大师",
            "vdata": "30.00",
            "vtask": "79.00"
        },
        {
            "vid": "9",
            "vname": "老顽童",
            "vdata": "89.00",
            "vtask": "98.00"
        },
        {
            "vid": "10",
            "vname": "郭襄",
            "vdata": "69.00",
            "vtask": "96.00"
        }]';
        $response_text = mask($msg);
        socket_write($msgsock, $response_text, strlen($response_text));
    } else {
        //这里不建议用array,因为json_encode之后出现空值,可能是编码问题。
        //一旦编码出问题,就是返回空,又不报错
        $msg = '{"error:"Invalid method"}';
        $response_text = mask(json_encode($msg));
        socket_write($msgsock, $response_text, strlen($response_text));
    };
    socket_close($msgsock);
} while (true);
socket_close($sock);
function hand_shake($buf)
{
    $buf = substr($buf, strpos($buf, 'Sec-WebSocket-Key:') + 18);
    $key = trim(substr($buf, 0, strpos($buf, "\r\n")));
    $new_key = base64_encode(sha1($key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));
    $new_message = "HTTP/1.1 101 Switching Protocols\r\n";
    $new_message .= "Upgrade: websocket\r\n";
    $new_message .= "Sec-WebSocket-Version: 13\r\n";
    $new_message .= "Connection: Upgrade\r\n";
    $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n";
    return $new_message;
}
//解码数据
function unmask($text)
{
    $length = ord($text[1]) & 127;
    if ($length == 126) {
        $masks = substr($text, 4, 4);
        $data = substr($text, 8);
    } elseif ($length == 127) {
        $masks = substr($text, 10, 4);
        $data = substr($text, 14);
    } else {
        $masks = substr($text, 2, 4);
        $data = substr($text, 6);
    }
    $text = "";
    for ($i = 0; $i < strlen($data); ++$i) {
        $text .= $data[$i] ^ $masks[$i % 4];
    }
    return $text;
}
function mask($text)
{
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);
    if ($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif ($length > 125 && $length < 65536)
        $header = pack('CCn', $b1, 126, $length);
    elseif ($length >= 65536)
        $header = pack('CCNN', $b1, 127, $length);
    return $header . $text;
}


亟需解决的三个问题:

  1. 如何保持websocket的长连接;
  2. 如何让websocket自动推送信息;
  3. 如何websocket连接MySql数据库;

Done!

相关文章
|
4天前
|
关系型数据库 MySQL 数据库连接
13 PHP数据的获取
路老师在知乎上分享了PHP语言的知识,帮助大家入门和深入理解PHP。本文介绍了从结果集中获取一行数据作为对象(`mysqli_fetch_object()`)、获取一行作为枚举数组(`mysqli_fetch_row()`)、获取查询结果集中的记录数(`mysqli_num_rows()`)、释放内存(`mysqli_free_result()`)以及关闭数据库连接(`mysqli_close()`)的方法,并提供了具体示例代码。
13 3
|
12天前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
15天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
93 1
|
1月前
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
126 1
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
15天前
|
JSON Dart 数据格式
<大厂实战场景> ~ flutter&鸿蒙next处理后端返回来的数据的转义问题
在 Flutter 应用开发中,处理后端返回的数据是常见任务,尤其涉及转义字符时。本文详细探讨了如何使用 Dart 的 `dart:convert` 库解析包含转义字符的 JSON 数据,并提供了示例代码和常见问题的解决方案,帮助开发者有效处理数据转义问题。
110 0
|
1月前
|
JavaScript 前端开发
vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)
本文提供了一个Vue 3教程,讲解了如何使用axios库手动从后端获取数据,包括安装axios、配置后端访问地址、编写路由地址、发起HTTP请求以及在组件中读取和打印响应数据的步骤。
294 0
vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)
|
2月前
|
JSON 数据格式
Blob格式转json格式,拿到后端返回的json数据
文章介绍了如何将后端返回的Blob格式数据转换为JSON格式,并处理文件下载和错误提示。
82 0
Blob格式转json格式,拿到后端返回的json数据
|
1月前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
|
3月前
|
前端开发 JavaScript
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
这篇文章介绍了使用AJAX技术将前端页面中表单接收的多个参数快速便捷地传输到后端servlet的方法,并通过示例代码展示了前端JavaScript中的AJAX调用和后端servlet的接收处理。
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
|
3月前
|
小程序 JavaScript Java
微信小程序+SpringBoot接入后台服务,接口数据来自后端
这篇文章介绍了如何将微信小程序与SpringBoot后端服务进行数据交互,包括后端接口的编写、小程序获取接口数据的方法,以及数据在小程序中的展示。同时,还涉及到了使用Vue搭建后台管理系统,方便数据的查看和管理。
微信小程序+SpringBoot接入后台服务,接口数据来自后端