@mcigorli

Почему нет ответа от клиента websocket к серверу websocket, workerman?

Просто ничего нет.Ни ошибок ничего.
От сервера приходит сообщение о коннекте, от клиента не приходит ничего..
Может ли быть такое что мой ubuntu18.04 как-то блокирует коннект к другому серверу ? Или мой код неверный?
Через приложение WSS хром к клиенту подключается без проблем как wss так и ws. (ну это так для теста). Так что Проблемы явно на моей стороне либо в коде либо на сервере.
Помогите кто чем сможет!
спасибо!

<?php
require_once __DIR__ . '/vendor/autoload.php'; 
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Connection\AsyncTcpConnection;

// SSL context.
$context = [ 'ssl' => [ 'local_cert' => '/etc/letsencrypt/live/utelimited.ru/fullchain.pem',
'local_pk' => '/etc/letsencrypt/live/utelimited.ru/privkey.pem',
'verify_peer' => false,
]
];
global $connection;
//==============================server
// Create a Websocket server
$ws_worker = new Worker ("websocket://0.0.0.0:100", $context);
$ws_worker->transport = 'ssl'; 


// Emitted when new connection come
$ws_worker-> onConnect = function($connection)
{
	 $connection->onWebSocketConnect = function($connection) 
    {
	 echo "New connection\n";
	 $connection->send ('Server OK: ' . $data);
	};
 };

// Emitted when data received
$ws_worker-> onMessage = function($connection, $data)
{
	// Send hello $data
    $connection->send ('hello ' . $data);
};

// Emitted when connection closed
 $ws_worker-> onClose = function($connection)
{
 echo "Connection closed\n";
};

 
//=============================== CLIENT
 
$worker_wss = new Worker ();
$worker_wss ->onWorkerStart = function() {
	foreach($ws_worker->connection as $connection) {
			$connection->send("connect client");
	}
	// Websocket protocol for client.
    $ws_connection = new AsyncTcpConnection('ws://ws.eodhistoricaldata.com/ws/crypto?api_token=demo');
	$ws_connection-> onConnect = function ($connection_wss) {
		foreach($ws_worker->connections as $connection) {
			$connection->send("connect client");
		}
	}; 
	$ws_connection->onMessage = function ($connection_wss, $data) {
		foreach($ws_worker->connections as $connection) {
			$connection->send($data);
		}
	}; 
	$ws_connection->onError = function ($connection_wss, $code, $msg) {
		echo "Error:  $msg\n";
		foreach($ws_worker->connections as $connection) {
			$connection->send($msg);
		}
	};
	$ws_connection->onClose = function ($connection_wss) {
		echo "Connection closed\n";
		foreach($ws_worker->connections as $connection) {
			$connection->send("close client");
		}
	}; 
	$ws_connection->connect();
};

// Run worker
Worker::runAll();
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
@mcigorli Автор вопроса
Вопрос решён.
Дело было в версии библиотеки workerman.
старая версия файла AsyncTcpConnection.php
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Immortal_pony
@Immortal_pony Куратор тега PHP
Во-первых, чего ты вообще пытаетешься добиться? Зачем подключаться клиентом к серверу в этом же файле? Не уверен что это вообще сработает, но теоретически возможно...

Во-вторых,
foreach($ws_worker->connection as $connection) {
     $connection->send("connect client");
}

При старте воркера клиента ты хвататешь объект с connection'ами сервера и перебираешь их? Как, зачем, и чего ты хочешь этим добиться?

В-третьих:
$ws_connection = new AsyncTcpConnection('ws://ws.eodhistoricaldata.com/ws/crypto?api_token=demo');

О, кажется пошли куда-то коннектитться.
Предположим, что ws.eodhistoricaldata.com - это твой сервер. И даже, что с помощью reverse proxy ты завернул этот url на порт 100 своего сайта, но вот что за "/ws/crypto" и "api_token=demo"? По коду выше видно, что твой сервер ни с чем таким не умеет работать. Ты точно туда коннектишься, куда хочешь?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы