PHP 搭建 webScoket 服务器

108 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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 文件 目录结构看下图:

log1.png

代码实现

我们先要引入 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文件夹里面的就是