使用Web套接字向客户端发送消息

时间:2018-10-01 20:17:30

标签: php websocket

我在laravel项目中使用https://github.com/orchidsoftware/web-socket,并且想向连接的客户端发送消息。

到目前为止,我已经遵循了自述文件并启动了服务器并开始运行-我收到警报“连接已建立。”。

但是当我尝试向客户端发送消息时,什么也没有发生。我创建了一个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 :(得分:3)

从另一个控制器?您无法访问在另一个线程(即服务器)中运行的进程(php脚本)。套接字服务器是连接的客户端之间的集线器,等待消息,如果收到消息,则再次发送出去(如果要求这样做)。换句话说-如果要向所有连接的客户端发送消息,则必须是其中之一。


您的初始代码看起来不错,服务器应该已启动并正在运行。因此,进行测试。

最简单的方法是打开一些与套接字服务器的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客户端接收消息。

答案 1 :(得分:0)

您的客户端应该通过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中的说明在后端遵循授权。

答案 2 :(得分:0)

如果您还没有阅读过该内容,则该主题存在一个封闭的问题,内容如下。

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

答案 3 :(得分:0)

我正在使用Swoole扩展程序进行套接字操作,而我从来没有像那样得到过issua。只需尝试一下您的服务即可; https://www.swoole.co.uk/