php webscokt_2.WebSocket PHP 即时通讯开发

本文介绍了如何使用Swoole的WebSocket服务器功能与ThinkPHP5结合,创建一个命令行启动的WebSocket服务。通过编写PHP代码设置WebSocket的生命周期回调函数,实现了从建立连接到发送和接收消息的功能。同时,提供了JavaScript客户端代码用于测试WebSocket服务器,并展示了Chrome浏览器调试工具中的成功连接响应。
摘要由CSDN通过智能技术生成

PHP 在之前的某一段时间里是被认为无法处理好协议层面的,但是随着Workerman,Swoole 以及目前风头正上的 MEEPOPS 的出现,彻底打破了这一局面,让很多人发现原来 PHP 能做的事越来越多。

接下来本章将详细介绍如何用 swoole_websocket_server 和 ThinkPHP5 的命令行来建立 websocket 服务器。

本章没有使用think-swoole Composer 包。

创建 ThinkPHP5 自定义命令行

在 ThinkPHP5 中推荐使用命令行工具来管理运行不需要外部访问的程序,如 http 服务器启动程序,websocket 服务器启动程序,crontab(计划任务/定时器)等

1.创建命令行类

-

- 创建application/console/WebSocket.php文件

```php

namespace app\Console;

use think\console\Command;

use think\console\Input;

use think\console\Output;

class WebSocket extends Command

{

// 命令行配置函数

protected function configure()

{

// setName 设置命令行名称

// setDescription 设置命令行描述

$this->setName('websocket:start')->setDescription('Start Web Socket Server!');

}

// 设置命令返回信息

protected function execute(Input $input, Output $output)

{

$output->writeln("WebSocket: Start.\n");

}

}

```

- 2.修改配置文件

文件所在 application/command.php

~~~

return [

'app\console\WebSocket',

];

~~~

这时在项目根目录输入命令行就可以看到已经配置好的命令行类及描述

编写 Web Socket 逻辑代码

接下来我们就可以正式编写 web socket 服务器的代码了,Swoole 帮我们内置了 web socket 服务器支持,通过几行 PHP 代码就可以写出一个异步非阻塞多进程的 web scoket 服务器。

在application/console/WebSocket.php文件中继续编写代码

```php

namespace app\Console;

use think\console\Command;

use think\console\Input;

use think\console\Output;

class WebSocket extends Command

{

// Server 实例

protected $server;

protected function configure()

{

$this->setName('websocket:start')->setDescription('Start Web Socket Server!');

}

protected function execute(Input $input, Output $output)

{

// 监听所有地址,监听 10000 端口

$this->server = new \swoole_websocket_server('0.0.0.0', 10000);

// 设置 server 运行前各项参数

// 调试的时候把守护进程关闭,部署到生产环境时再把注释取消

// $this->server->set([

// 'daemonize' => true,

// ]);

// 设置回调函数

$this->server->on('Open', [$this, 'onOpen']);

$this->server->on('Message', [$this, 'onMessage']);

$this->server->on('Close', [$this, 'onClose']);

$this->server->start();

// $output->writeln("WebSocket: Start.\n");

}

// 建立连接时回调函数

public function onOpen(\swoole_websocket_server $server, \swoole_http_request $request)

{

echo "server: handshake success with fd{$request->fd}\n";

}

// 收到数据时回调函数

public function onMessage(\swoole_websocket_server $server, \swoole_websocket_frame $frame)

{

echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";

$server->push($frame->fd, "this is server");

}

// 连接关闭时回调函数

public function onClose($server, $fd)

{

echo "client {$fd} closed\n";

}

}

```

在命令行输入

~~~

php think websocket:start

~~~

启动 web socket 服务器

接下来我们使用 JavaScript 代码来测试 Web Socket 服务器是否正常运行,推荐使用 Chrome 来进行调试

~~~

var websocket = new WebSocket('ws://localhost:10000');

websocket.onopen = function (evt) { onOpen(evt) };

websocket.onclose = function (evt) { onClose(evt) };

websocket.onmessage = function (evt) { onMessage(evt) };

websocket.onerror = function (evt) { onError(evt) };

function onOpen(evt) {

console.log("Connected to WebSocket server.");

}

function onClose(evt) {

console.log("Disconnected");

}

function onMessage(evt) {

console.log('Retrieved data from server: ' + evt.data);

}

function onError(evt) {

console.log('Error occured: ' + evt.data);

}

~~~

![](https://box.kancloud.cn/dc0198372b19d3182132461cf250f9a7_489x290.png)

打开 Chrome 浏览器的调试工具,切换到 Console 选项卡下看到如下图结果,表示 web socket 连接成功

同时服务器端命令行下应该看到如下回执消息

`server: handshake success with fd1`

![](https://box.kancloud.cn/718dd7204a63c22681994468a2d62644_698x168.png)

org.java_websocket是一个Java语言实现的WebSocket协议库,它提供了WebSocket客户端和服务器端的功能。通过使用org.java_websocket库,你可以轻松地创建WebSocket客户端来与WebSocket服务器进行通信。 要使用org.java_websocket库实现WebSocket客户端,你需要进行以下步骤: 1. 导入org.java_websocket库:首先,你需要将org.java_websocket库添加到你的Java项目。你可以通过在项目的构建文件(如Maven或Gradle)添加相应的依赖来实现。 2. 创建WebSocket客户端对象:使用org.java_websocket库,你可以创建一个WebSocketClient对象来表示WebSocket客户端。你需要提供WebSocket服务器的URL作为参数来初始化WebSocketClient对象。 3. 实现WebSocketClient的回调方法:WebSocketClient类提供了一些回调方法,用于处理与WebSocket服务器的连接、消息接收和错误处理等。你需要扩展WebSocketClient类,并重写这些回调方法来实现自定义的逻辑。 4. 连接到WebSocket服务器:通过调用WebSocketClient对象的connect()方法,你可以连接到WebSocket服务器。 5. 发送和接收消息:一旦连接建立,你可以使用WebSocketClient对象的send()方法发送消息到服务器,并通过重写onMessage()方法来处理从服务器接收到的消息。 下面是一个简单的示例代码,演示了如何使用org.java_websocket库实现WebSocket客户端: ```java import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import java.net.URI; import java.net.URISyntaxException; public class MyWebSocketClient extends WebSocketClient { public MyWebSocketClient(String serverUrl) throws URISyntaxException { super(new URI(serverUrl)); } @Override public void onOpen(ServerHandshake handshakedata) { System.out.println("Connected to WebSocket server"); } @Override public void onMessage(String message) { System.out.println("Received message: " + message); } @Override public void onClose(int code, String reason, boolean remote) { System.out.println("Disconnected from WebSocket server"); } @Override public void onError(Exception ex) { System.err.println("WebSocket error: " + ex.getMessage()); } public static void main(String[] args) { try { MyWebSocketClient client = new MyWebSocketClient("ws://localhost:8080/websocket"); client.connect(); } catch (URISyntaxException e) { e.printStackTrace(); } } } ``` 在上面的示例,我们创建了一个名为MyWebSocketClient的类,它扩展了WebSocketClient类,并重写了一些回调方法。在main()方法,我们创建了一个MyWebSocketClient对象,并通过调用connect()方法连接到WebSocket服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值