Отправка сообщения клиенту через веб-сокеты - PullRequest
0 голосов
/ 01 октября 2018

Я использую https://github.com/orchidsoftware/web-socket в своем проекте laravel и хочу отправлять сообщения подключенным клиентам.

До сих пор я следовал README и запустил сервер - и яполучить предупреждение «Соединение установлено».

Но когда я пытаюсь отправить сообщение клиенту, ничего не происходит.Я создал функцию sendMessageToAll и попытался вызвать ее как из onOpen, так и из другого контроллера:

public function onOpen(ConnectionInterface $conn)
{
    $this->clients->attach($conn);
    $this->sendMessageToAll("message");
}

public function sendMessageToAll($msg){
    foreach ($this->clients as $client) {
        $client->send($msg);
    }
}

И из другого контроллера:

public function test() {
    $ws = new WebSocketClass();
    $ws->sendMessageToAll("testing");
}

Есть что-то, чего мне не хватаетчтобы его запустить и запустить?

Ответы [ 4 ]

0 голосов
/ 07 октября 2018

Я использую расширение Swoole для операций с сокетами, и у меня никогда не было такого выпуска.Просто попробуйте это к вашим услугам;https://www.swoole.co.uk/

0 голосов
/ 05 октября 2018

Ваш клиент должен быть подключен к вашему сокет-серверу через Javascript, как написано в документации:

var socket = new WebSocket("ws://localhost");

socket.onopen = function() {
  alert("The connection is established.");
};

socket.onclose = function(event) {
  if (event.wasClean) {
    alert('Connection closed cleanly');
  } else {
    alert('Broken connections'); 
  }
  alert('Key: ' + event.code + ' cause: ' + event.reason);
};

socket.onmessage = function(event) {
  alert("The data " + event.data);
};

socket.onerror = function(error) {
  alert("Error " + error.message);
};


//To send data using the method socket.send(data).

//For example, the line:
socket.send("Hello");

И вам нужно сначала запустить ваш сокет-сервер так:

    Create socket listener:

To create a new listener, you need to

php artisan make:socket MyClass

In the folder app/HTTP/Socket/Listener create template Web listener socket

After creating a need to establish a route which Is located routes/socket.php

//routing is based on an Symfony Routing Component
$socket->route('/myclass', new MyClass, ['*']);

To launch the web-socket, use the command:

php artisan socket:serve

Затемвы следуете Авторизации в бэкэнде, как указано в github.

0 голосов
/ 06 октября 2018

Если вы еще не прочитали его, в этой теме есть закрытая проблема, в которой говорится следующее:

you must send a message using php to the working socket. I use Pawl for such purposes.

Вопрос: Как отправить сообщение со стороны сервера?# 11

https://github.com/orchidsoftware/web-socket/issues/11

0 голосов
/ 04 октября 2018

с другого контроллера?Вы не можете получить доступ к процессу (php script), запущенному в другом потоке (это ваш сервер).Сокет-сервер - это концентратор между подключенными клиентами, который ожидает сообщения и, если получает его, отправляет его снова (если это сказано).Другими словами - если вы хотите отправить сообщение всем подключенным клиентам, вы должны быть одним из них.


Ваш исходный код выглядит нормально, сервер должен быть запущен.Итак, проверьте это.

Самый простой способ - это открыть некоторые telnet-соединения с вашим сокет-сервером и запустить обмен сообщениями.

public function onOpen(ConnectionInterface $conn)
{
    $this->clients->attach($conn);
    $msg = "Connection established!\n"
    echo $msg;                        // send server log to shell
    sendMessageToAll($msg);           // your initial function should be working
}

public function onMessage(ConnectionInterface $from, $msg) {
    echo "Message from: {$conn->resourceId} received!\n";  //log again
    sendMessageToAll($msg);
}

public function onError(ConnectionInterface $conn, \Exception $e) {
    echo "Error: {$e->getMessage()}\n";
    $conn->close();
}

Кроме того, отладьте функцию отправки:

public function sendMessageToAll($msg){
    foreach ($this->clients as $client) {
        echo "Sending message to {$client->resourceId} \n";
        $client->send($msg);
    }
}

Теперь откройте несколько соединений telnet с вашим портом сокет-сервера (это будет замечено на консоли сервера):

telnet 127.0.0.1 8080

и отправьте сообщение от одного из них.Опять же, вы должны получить уведомление от сервера и получить сообщение от каждого клиента telnet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...