基于 Swoole 搭建 WebSocket 服务详解

3,394 阅读3分钟

本节将会详解以下 4 个问题:

什么是 swoole?

什么是 Websocket?

如何基于 Swoole 构建 WebSocket 服务?

基于 Swoole 的 WebSocket 服务和 Http 服务是什么关系?

一、 Swoole 简介

Swoole 是一个面向生产环境的 PHP 异步网络通信引擎,使 PHP 开发人员能够编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP 和 WebSocket 服务。Swoole 可广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网 (IOT)、车联网、智能家居等领域。使用 PHP+Swoole 作为网络通信框架,可以大大提高企业 IT R&D 团队的工作效率。

Swoole 支持用于构建各种服务器,包括 HTTP 服务器、websocket 服务器、tcp 服务器、redis 服务器等等。我们在这里使用 websocket 服务器。

二、WebSocket 介绍

WebSocket 是通过单一 TCP 连接进行全双工通信的协议。WebSocket 通信协议在 2011 年被 IETF 指定为标准 RFC 6455,并由 RFC7936 进行了补充。WebSocket API 也被 W3C 指定为标准。WebSocket 使得客户端和服务器之间的数据交换更加容易,并允许服务器主动将数据推送到客户端。在 WebSocket API 中,浏览器和服务器只需要握手一次,就可以直接创建持久连接,进行双向数据传输。

简单来说,websocket 协议实现了浏览器和服务器之间的双向通信。Html5 原生支持 websocket 协议。

三、如何基于 Swoole 构建 WebSocket 服务

使用以下代码创建一个名为 ws_server.php 的新文件:

您可以通过在命令行上执行以下命令来启动 WebSocket 服务。该命令如下所示:

php ws_websocket.php

可以在 Chrome 浏览器进行测试,JS 代码如下:

在 Chrome 浏览器的控制台上执行上述 js 代码,可以看到以下输出结果:

Connected to WebSocket server.

如果要从客户端向服务器发送数据,可以通过 WebSocket 的 send 函数向服务器发送信息:

**socket.send (' 发送的内容 '); **//socket 为 WebSocket 的对象实例

四、基于 Swoole 的 WebSocket 服务和 Http 服务的关系

WebSocket 服务是基于 Http 服务的长连接服务器,客户端首现会发送 Http 请求与服务器握手。当握手成功时,将触发 onOpen 事件。在 onOpen 函数中,可以获得一个 $request 对象,该对象包含与 Http 握手相关的信息,如 GET 参数、Cookie、Http 头信息等。

当客户端和服务器之间的连接建立后,客户端和服务器可以进行双向通信。连接建立后,当客户端向服务器发送信息时,服务器会触发 onMessage 事件回调;服务器可以调用 $server->push () 向客户端发送消息。服务器可以设置 onHandShake 事件回调来手动处理 WebSocket 握手。

注意事项:

Swole _ Http _ server 是 swole _ Http _ server 的子类,内置了对 Http 的支持。swole _ WebSocket _ server 是 swole _ http _ server 的子类。在内置 WebSocket 的支持下,swoole_client 无法与 WebSocket 服务器直接通信。swoole_client 是一个 TCP 客户端,必须实现 WebSocket 协议才能与 WebSocket 服务进行通信。WebSocket 服务除了提供 WebSocket 功能外,其实还可以处理 Http 长连接。只需要 onRequest 事件监控就可以实现 Comet 方案的长 Http 轮询。

完整附件点此下载