laravel - Flutter - Pusher & EchoClient - 连接但不接收来自通道的事件
问题描述
我正在尝试使用 Pusher 作为广播器将我的颤振应用程序连接到 laravel websocket。
我能够使用以下Flutter 代码将我的 Flutter 应用程序连接到 laravel websocket :
Echo echoSetup(token, pusherClient) {
return new Echo({
'broadcaster': 'pusher',
'client': pusherClient,
"wsHost": 'laravel-server.test',
"httpHost": 'laravel-server.test',
"wsPort": 6001,
'auth': {
"headers": {'Authorization': 'Bearer $token'}
},
'authEndpoint': 'http://laravel-server.test/api/broadcasting/auth',
"disableStats": true,
"forceTLS": false,
"enabledTransports": ['ws', 'wss']
});
}
FlutterPusher getPusherClient(String token) {
PusherOptions options = PusherOptions(
encrypted: false,
host: 'laravel-server.test',
cluster: 'mt1',
port: 6001,
auth: PusherAuth('http://laravel-server.test/api/broadcasting/auth',
headers: {'Authorization': 'Bearer $token'}));
return FlutterPusher('********************', options, enableLogging: true);
}
void _setUpEcho() {
final token = Prefer.prefs.getString('api_token');
pusherClient = getPusherClient(token);
echo = echoSetup(token, pusherClient);
pusherClient.connect(onConnectionStateChange: onConnectionStateChange);
echo.join("app")
..here((users) => print('users'))
..listenForWhisper("typing", (event) {
// log(User.fromJson((event)['user']).username);
// typingTimer.cancel();
print("Typing");
})
..listen("MessageSent", (event) {
print("MessageSent");
print(event);
})
..listen("MessageRead", (event) {
print("MessageRead");
})
..joining((user) {
print(user);
})
..leaving((user) {
print(user);
});
}
在 laravel 上,我正在使用 Beyondcode/laravel-websockets 包处理 websockets,方法是运行以下命令:
php artisan config:clear && php artisan websockets:clean && php artisan websockets:serve
正在成功接收来自颤振应用程序的连接:
Starting the WebSocket server on port 6001...
New connection opened for app key d90a096cb11a24224e65.
Connection id 539868010.286231392 sending message {"event":"pusher:connection_established","data":"{\"socket_id\":\"539868010.286231392\",\"activity_timeout\":30}"}
问题是,每当我发送事件时,Flutter 应用程序都不会收到该事件,但 laravel 日志显示以下内容:
Connection id 522168000.296786193 sending message {"event":"log-message","channel":"private-websockets-dashboard-api-message","data":{"type":"api-message","time":"08:53:23","details":"Channel: app, Event: MessageSent","data":"[]"}}
这是我在 laravel 上的 .env 文件:
APP_NAME=Doggo
APP_ENV=local
APP_KEY=base64:4McNATirACsK+TIbKd0mWTh3gYX14eF97iHW9lZTD6Q=
APP_DEBUG=true
APP_HOST=laravel-server.test
APP_URL=http://laravel-server.test/
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=pusher
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
PUSHER_APP_ID=******
PUSHER_APP_KEY=*********
PUSHER_APP_SECRET=********
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
API_PREFIX=api
为什么 Flutter 只能连接,不能接收事件?
解决方案
您需要确保您的客户端订阅了广播事件的同一频道,并且客户端还需要绑定到同名事件。
推荐阅读
- javascript - 我怎么知道谁投票而不将他们登录到我的应用程序..?
- php - 在上游“php”中找不到 kubernetes 主机
- python - 如何根据函数是否已执行触发条件?
- javascript - 阅读 ESlint 文档后无法理解 JavaScript 中的 ASTnode、SourceCode、Token
- mysql - Mysql查询按部分获取最大年龄,如果两个或更多具有相同年龄,则返回具有最小ID的学生
- android - 从另一个片段打开一个片段
- azure-devops - 为什么我不能将工作项分配给团队成员?
- html - 我们可以在不使用类和 ID 的情况下使用 div 标签设置字体系列、字体大小吗?它被认为是好还是坏的做法?
- python - Python Scrapy Pipeline 编辑最后一项?
- vim - 为不起作用的 vim 功能添加了新脚本