php - 使用 Web Socket 向客户端发送消息
问题描述
我在我的 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");
}
为了让它启动和运行,我有什么遗漏吗?
解决方案
来自另一个控制器?您无法访问在另一个线程(即您的服务器)中运行的进程(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);
}
}
现在,打开一些到您的 socketserver 端口的 telnet 连接(在服务器控制台中引起注意):
telnet 127.0.0.1 8080
并从其中之一发送消息。同样,您应该从服务器收到通知并接收每个 telnet 客户端的消息。
推荐阅读
- texinfo - 尝试进行 TexInfo PDF 输出时出现错误
- git - Gitlab-ci.yml 配置
- typescript - Typescript自省类型到字符串
- python - 通过调用行名而不是行位置来显示特定行的所有列值
- bash - 打印第三个字符是数字的行
- vue.js - 如何在 vue cli 中修改 index html?
- php - 从 tawk 的 webhook 中抓取其他字段的值到
- mysql - 在 laravel 中显示基于数量的 product_id 总和
- flutter - 无法加载资产
- java - Java 注释处理器 getEnclosureElement() 方法