携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
使用背景
在公司开发一款桌面应用时,发现一些页面用 qt 等语言写起来非常的麻烦,并且还原度不高,就采取嵌入网页的模式进行开发。前端采用 vue 的多页面方式进行开发,每个页面都单独的生成一个html文件。和后端的数据传输则采用 webScoket 的形式(暂且把 QT 称为后端)
前期准备
安装 workerman
我们用到了 workerman 所以要先下载它。我们采用 composer 安装 workerman,composer的安装这里就不描述了,看中文网的地址就可以了 www.phpcomposer.com/
下载之前先新建一个文件夹,我这起名是socketServe
安装workerman composer require workerman/workerman
完善文件结构
这里我们需要用到的是 vendor 这个文件夹,其他的删掉留着都行。
我们在socketServe目录下新建一个 serve.php 文件
目录结构看下图:
代码实现
我们先要引入 autoload.php 文件, 并且监听 6161 端口
$worker->onConnect 是连接之后执行的方法 可以在连接后写上你自己的逻辑
$worker->onMessage 接受到前端数据时执行的方法
$connection->send($data) 是给前端发送数据
<?php
require __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
// 使用websocket协议监听6161端口
$worker = new Worker('websocket://0.0.0.0:6162');
$worker->onConnect = function(TcpConnection $connection) {
// webScoket 连接后执行
$data = 'your data';
$connection->send($data);
}
$worker->onMessage = function(TcpConnection $connection, $data) {
// $data 前端给过来的数据
// 根据自己的逻辑来进行处理
switch ($data) {
// ping 是心跳数据,用来维持连接,只返回 pong 字符串,无需做其它处理
case 'ping':
$connection->send('pong');
break;
}
}
Worker::runAll();
?>
写在最后
当然他们 QT 怎么写的我不知道哈哈哈,我这是模拟一下,因为有些情况比较特殊,有一些工具没办法很好的模拟 QT 传过来的数据。而且 QT 开发这个功能需要时间,我前端也不能一直等着,就想着自己搭建一个简单的服务。这里展示的只是简单的一个方式,具体的你可以看一下 https://github.com/walkor/workerman workerman 不仅仅用于webScoket 他的功能是很强大的,有兴趣的可以去了解一下。
使用 workerman 搭建一个 webScoket 的服务器是很简单的事情,因为我们不需要去造轮子,东西别人已经写好了,但是workerman的作用不仅仅是用于webScoket,如果你不满足于仅仅是使用工具的话,你可以去看看他的源码,vendor文件夹里面的就是