我在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");
}
要启动并运行它,我缺少什么吗?
答案 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
答案 3 :(得分:0)
我正在使用Swoole扩展程序进行套接字操作,而我从来没有像那样得到过issua。只需尝试一下您的服务即可; https://www.swoole.co.uk/