Javascript Websocket超时过快
我已经设置了一个标准的Phoenix websocket/频道环境,但我没有使用提供的socket.js-我有自己的(非常简单)代码连接到频道和主题。但是,我无法让套接字持续一分钟左右。有没有办法定义套接字的超时?我在Phoenix方面没有任何特殊配置(根据文档,所有配置都是标准配置) 我的javascript代码如下所示:Javascript Websocket超时过快,javascript,sockets,websocket,elixir,phoenix-framework,Javascript,Sockets,Websocket,Elixir,Phoenix Framework,我已经设置了一个标准的Phoenix websocket/频道环境,但我没有使用提供的socket.js-我有自己的(非常简单)代码连接到频道和主题。但是,我无法让套接字持续一分钟左右。有没有办法定义套接字的超时?我在Phoenix方面没有任何特殊配置(根据文档,所有配置都是标准配置) 我的javascript代码如下所示: const ws = new WebSocket(sock_url); ws.onmessage = (msg) => { const { payload, ev
const ws = new WebSocket(sock_url);
ws.onmessage = (msg) => {
const { payload, event } = JSON.parse(msg.data);
if (!event.startsWith("phx_")) {
onMessage(payload.body);
}
};
ws.onclose = (code, reason) => {
onClose(code, reason);
};
ws.onopen = () => {
ws.send(JSON.stringify({
topic: `users_socket:${user_id}`,
event: "phx_join",
payload: {},
ref: '1'
}));
};
更新:我最终使用了Phoenix随附的socket.js文件,正如大家所建议的那样——它只做了我需要的一切。感谢所有回答的人:)我正在开发一个websocket项目(使用Go not Phoenix或Elixir),我遇到了同样的断开问题,我通过“ping”websocket(即在特定的时间间隔内发送消息)解决了这些问题(至少从那以后没有超时) 也许您可以在Javascript中使用类似的内容
ws.onopen = () => {
ws.send(/** YOUR CODE */);
// Send a ping event every 10 seconds
setInterval(() => ws.send(JSON.stringify({ event: "ping" })), 10000);
}
并在服务器端相应地处理此新事件类型。您还可以尝试监视
onclose
事件,并根据原因重新打开连接。您可以在中找到此类事件代码的列表。phoenix后端希望每30秒进行一次ping。您可以这样重新配置它:
defmodule UserSocket do
use Phoenix.Socket
## Transports
transport :websocket, Phoenix.Transports.WebSocket,
timeout: 300_000, # 5 minutes
transport_log: :debug
...
end
如果您不关心超时,可以将其设置为非常高。上面的代码将其设置为5分钟
一般来说,phoenix.js将为您实现所有这些。这是一个非常小的库。最后,您会发现您实现了库中的所有内容,并犯了一系列错误:-)您有什么理由不只是使用提供的phoenix socket模块吗?它是一个更大库的一部分,要求代码保持简单,不受“外部”库的影响。但是如果我最终遇到太多此类问题,我可能会使用phoenix附带的JS代码。谢谢!我正在考虑一个类似的解决方案,但想知道Phoenix套接字实现是否内置了一些东西。如果没有,我会将此标记为答案。Phoenix确实做到了我建议坚持的标准实现,它可以处理更多的事情,例如不支持WebSocket的浏览器的回退、出现连接问题时的自动重新连接、客户端脱机时的消息本地缓冲,处理状态信息等。但它仍然只有大约500 LOC(以
cloc
计算)。此外,您也不会从官方客户端的错误修复和更新中受益。强烈建议坚持使用标准溶液。@PatrickOscity谢谢Patrick。我从未使用过Phoenix或Elixir,所以我不知道框架的细节。只是给出了一个通用的解决方案。我同意OP应该尽可能使用框架的功能。值得在network
tab中查看Phoenix如何敲入频道以保持套接字的连接处于唤醒状态。