我正在创建一个使用websockets进行实时通信的API。我使用Laravel 8 with Pusher作为后端的广播驱动程序,Soketi作为windows(开发环境)上的web sockets服务器,我使用postman来测试请求。
问题是,我与Soketi网络套接字服务器的连接总是在与4201 Error: Connection was closed due to an unknown error
连接大约2分钟后崩溃。我希望连接持续更长时间或理想情况下无限期,至少我认为这是它应该如何工作。
控制台连接消息:
控制台断开消息:
Postman和控制台都显示错误,请注意从连接到断开连接的时间。
我做了一个工作,迫使 Postman 重新连接,如果一个意外的错误导致它关闭,但这并不重新连接到断开连接前订阅的频道。
在config\broadcasting.php
中,我有:
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'host' => env('PUSHER_HOST'),
'port' => env('PUSHER_PORT'),
'scheme' => env('PUSHER_SCHEME', 'http'),
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => env('PUSHER_SCHEME') === 'https',
],
],
我的Soketi配置:
{
"debug": true,
"port": 6001,
"appManager.array.apps": [
{
"id": "SLMT",
"key": "1229272",
"secret": "sLq2dAswE&9q",
"webhooks": [
{
"url": "",
"event_types": ["channel_occupied"]
}
]
}
]
}
key
和secret
的值只用于开发,这就是为什么不要隐藏它们。任何帮助都是非常感谢的,因为如果连接不断中断,这种情况会使测试websocket事件变得非常乏味。
- 编辑**
我忘了提到一个重要的信息。我的项目是一个API,它使用Sanctum来验证用户。它不提供任何Html。以防有人想要复制。
1条答案
按热度按时间n6lpvg4x1#
好的,我想我已经弄明白了。我相信套接字连接关闭是由于活动超时。
我是如何得出这个结论的?
我有另一个应用程序也使用Web套接字,但它不使用API,而是服务于Html。无论如何,我启动了Soketi服务器,但使用了特定于Html项目的不同凭据,我将控制台输出与API项目进行了比较,在API项目中出现了问题。我注意到,在Html应用程序上,使用Laravel echo,客户端每30秒向服务器发送一个
pusher:ping
事件。并且服务器用pusher:pong
事件进行应答。有趣的是,
pusher:pong
事件增加了WebSocket连接输出的Timeout
属性下的_iddleStart:
值,这基本上防止了连接由于不活动而关闭。我认为2分钟延迟的原因来自_iddleTimeout:120000
属性。(请参考问题上的图像以了解清楚)在发现这个问题之后,我回到我的API应用程序,在Postman上创建了一个
pusher:ping
事件消息,然后我每分钟手动地将其发送到服务器,连接保持不变!我提到的ping消息在Postman上看起来如下:那么,为什么一开始就这么难弄清楚呢?
我不得不承认我有我的怀疑,但我不想得出任何结论,没有检查.错误显示的服务器是不详细或描述,它字面上说
Connection was closed due to an unknown error
,并没有查找表的错误代码afaik.这意味着什么?
嗯,在我看来这是一个 Postman 的问题。在WebSocket实现中,客户端负责保持与服务器的连接打开,对吗? Postman 至少应该给予一个选项来自动发送一些消息,但我会放他们一马,因为显然他们的WebSocket请求仍处于beta开发阶段。
我也觉得应该有更详细的错误信息提供的Soketi服务器输出,但他们也我会削减一些松弛,因为它是一个相当新的服务器应用程序,这实际上是伟大的,非常稳定,如果我可以补充。