laravel 为什么套接字连接意外关闭?

ukdjmx9f  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(185)

我正在创建一个使用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"]
                }
            ]
        }
    ]
}

keysecret的值只用于开发,这就是为什么不要隐藏它们。任何帮助都是非常感谢的,因为如果连接不断中断,这种情况会使测试websocket事件变得非常乏味。

    • 编辑**

我忘了提到一个重要的信息。我的项目是一个API,它使用Sanctum来验证用户。它不提供任何Html。以防有人想要复制。

n6lpvg4x

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上看起来如下:

{
    "event":"pusher:ping",
    "data":{}
}

那么,为什么一开始就这么难弄清楚呢?

我不得不承认我有我的怀疑,但我不想得出任何结论,没有检查.错误显示的服务器是不详细或描述,它字面上说Connection was closed due to an unknown error,并没有查找表的错误代码afaik.

这意味着什么?

嗯,在我看来这是一个 Postman 的问题。在WebSocket实现中,客户端负责保持与服务器的连接打开,对吗? Postman 至少应该给予一个选项来自动发送一些消息,但我会放他们一马,因为显然他们的WebSocket请求仍处于beta开发阶段。
我也觉得应该有更详细的错误信息提供的Soketi服务器输出,但他们也我会削减一些松弛,因为它是一个相当新的服务器应用程序,这实际上是伟大的,非常稳定,如果我可以补充。

相关问题