我正在创建一个与多个项目交互的功能。 有两个项目,其中一个是要填充的应用程序,另一个项目中,可以看到所有应用程序响应。 我希望实现一个函数来在有人填充应用程序时更新应用程序响应,对于这个任务,每当我从WebSockets获取msg时,我都希望使用WebSockets在项目和更新(附加新响应)页面之间进行交互。
现在通过https和wss连接WebSockets我无法连接并收到类似“ERR_SSL_PROTOCOL_ERROR”的错误但是当我使用ws通过http连接时我工作正常。我在localhost上使用自签名证书
<?php
require_once 'Autoloader.php';
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
// массив для связи соединения пользователя и необходимого нам параметра
$users = [];
// создаём локальный tcp-сервер, чтобы отправлять на него сообщения из кода нашего сайта
$tcp_worker = new Worker("tcp://127.0.0.1:1234");
// создаём обработчик сообщений, который будет срабатывать,
// когда на локальный tcp-сокет приходит сообщение
$tcp_worker->onMessage = function($connection, $data) use ($tcp_worker)
{
// пересылаем сообщение во все остальные соединения - это 4 ws-сервера, код которых будет ниже
foreach ($tcp_worker->connections as $id => $webconnection) {
if ($connection->id != $id) {
$webconnection->send($data);
}
}
};
$context = array(
'ssl' => array(
'local_cert' => '/private/etc/apache2/ssl/localhost.pem',
'local_pk' => '/private/etc/apache2/ssl/localhost.key',
)
);
// Create a Websocket server with ssl context.
$ws_worker = new Worker("websocket://0.0.0.0:8000", $context);
// создаём ws-сервер, к которому будут подключаться все наши пользователи
// $ws_worker = new Worker("websocket://0.0.0.0:8000");
$ws_worker->count = 4;
// создаём обработчик, который будет выполняться при запуске каждого из 4-х ws-серверов
$ws_worker->onWorkerStart = function() use (&$users)
{
//подключаемся из каждого экземпляра ws-сервера к локальному tcp-серверу
$connection = new AsyncTcpConnection("tcp://0.0.0.0:1234");
$connection->onMessage = function($connection, $data) use (&$users) {
$data = json_decode($data);
// отправляем сообщение пользователю по userId
if (isset($users[$data->user])) {
$webconnection = $users[$data->user];
$webconnection->send($data->message);
}
};
$connection->connect();
};
$ws_worker->onConnect = function($connection) use (&$users)
{
$connection->onWebSocketConnect = function($connection) use (&$users)
{
// при подключении нового пользователя сохраняем get-параметр, который же сами и передали со страницы сайта
$users[$_GET['user']] = $connection;
// вместо get-параметра можно также использовать параметр из cookie, например $_COOKIE['PHPSESSID']
};
};
$ws_worker->onClose = function($connection) use(&$users)
{
if(isset($users[$connection->uid]))
{
// удаляем параметр при отключении пользователя
unset($users[$connection->uid]);
}
};
// Run worker
Worker::runAll();
前端代码
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script>
ws = new WebSocket("wss://127.0.0.1:8000/?user=tester01");
ws.onmessage = function(evt) {alert(evt.data);};
</script>
</head>
</html></source>