商城首页欢迎来到中国正版软件门户

您的位置:首页 >利用ThinkPHP6实现Websocket广播功能

利用ThinkPHP6实现Websocket广播功能

  发布于2025-03-23 阅读(0)

扫一扫,手机访问

一、前言

Websocket是HTML5的一个实时网络协议,它可以在客户端和服务器之间建立一个长连接,实现双向通信,使得服务器可以主动向客户端发送数据,而不需要客户端主动发起请求。因此,Websocket在实时性要求高的应用场景下非常常见,如在线聊天室、即时通讯等。

在本文中,我们将探讨如何利用ThinkPHP6框架实现Websocket广播功能。

二、环境准备

  • PHP 7.2+
  • Swoole 4.4+
  • Composer
  • ThinkPHP6

三、安装Swoole扩展

我们可以使用pecl命令来安装Swoole扩展。

pecl install swoole

当然,你也可以下载源码来编译安装。

四、创建ThinkPHP6项目

使用composer创建一个新的ThinkPHP6项目。

composer create-project topthink/think=6.x project_name

五、安装Swoole框架

在我们的ThinkPHP6项目中,需要安装Swoole框架,使得我们能够利用Swoole封装的Websocket组件。

composer require swoole/ide-helper:^4.4.0
composer require swoole/library:^4.4.0
composer require swoole/serialization:^4.4.0
composer require swoole/autoload:^4.4.0

六、编写Websocket服务端

在ThinkPHP6框架中,我们可以通过Swoole扩展来创建一个Websocket服务器

先在项目根目录下创建一个websocket.php文件,作为Websocket服务端启动文件。

在websocket.php文件中,添加以下代码:

<?php
use SwooleWebSocketServer;

// 创建Websocket服务器
$server = new Server("0.0.0.0", 9501);

// 监听Websocket连接事件
$server->on("open", function (Server $server, SwooleHttpRequest $request) {
    // 新增连接
    echo "open: {$request->fd}
";
});

// 监听Websocket消息事件
$server->on("message", function (Server $server, SwooleWebSocketFrame $frame) {
    // 广播消息
    foreach ($server->connections as $fd) {
        if ($server->isEstablished($fd)) {
            $server->push($fd, $frame->data);
        }
    }
});

// 监听Websocket关闭事件
$server->on("close", function (Server $server, int $fd) {
    // 关闭连接
    echo "close: {$fd}
";
});

// 启动Websocket服务器
$server->start();

上面的代码中,我们创建了一个Websocket服务器,并绑定到本地的9501端口。然后,我们监听了Websocket的三个事件:

  • open:新建连接事件,当有客户端连接到Websocket服务器时触发。
  • message:收到消息事件,当有客户端发送消息到Websocket服务器时触发。
  • close:关闭连接事件,当有客户端关闭连接时触发。

在message事件中,我们使用foreach循环遍历Websocket服务器的连接,并将消息广播给每一个客户端。

七、启动Websocket服务器

打开命令行工具,进入项目根目录,执行以下命令来启动Websocket服务器

php websocket.php

如果一切正常,命令行工具将会输出一条类似下面的信息。

Swoole WebSocket Server is started at http://0.0.0.0:9501

到此,我们就成功地启动了一个Websocket服务器。现在我们可以使用浏览器打开如下网址,测试是否能够正常连接Websocket服务器

ws://127.0.0.1:9501

八、编写Websocket客户端

我们可以使用JavaScript来编写一个简单的Websocket客户端,用于测试Websocket服务器的广播功能。

创建一个index.html文件,添加以下代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Websocket Broadcast Test</title>
    </head>
    <body>
        <h1>Websocket Broadcast Test</h1>
        <hr>
        <p>Message:</p>
        <input type="text" id="message">
        <button onclick="send()">Send</button>
        <hr>
        <div id="result"></div>
        <script>
            var socket = new WebSocket("ws://127.0.0.1:9501");

            socket.onopen = function(event) {
                console.log("Websocket connected");
            };

            socket.onmessage = function(event) {
                console.log("Received message:", event.data);
                document.getElementById("result").innerHTML += event.data + "<br>";
            };

            socket.onclose = function(event) {
                console.log("Websocket closed");
            };

            function send() {
                var message = document.getElementById("message").value;
                socket.send(message);
            }
        </script>
    </body>
</html>

这里我们创建了一个简单的界面,用于测试向Websocket服务器发送广播消息的效果。

当我们在输入框中输入消息内容,点击Send按钮,消息会自动显示在下面的div标签中,同时我们也可以在命令行工具中看到广播的消息。

至此,我们已经成功利用ThinkPHP6实现了Websocket广播功能。你可以尝试修改代码,实现更复杂的功能,如向指定客户端发送消息等。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注