我已经设置了一个标准的Phoenix websocket / channel环境,但我没有使用提供的socket.js - 我有自己的(非常简单的)代码连接到频道和主题。但是,我不能让套接字持续超过一分钟左右。有没有办法定义套接字的超时?我在Phoenix方面没有任何特殊配置(根据文档的所有标准)
我的javascript代码如下:
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'
}));
};
更新:我最终使用凤凰城附带的socket.js文件,大家建议 - 它只是做我需要的一切。感谢所有回答:)的人。
答案 0 :(得分:2)
我正在使用Websockets(使用Go not Phoenix或Elixir)开发一个项目,并且我已经遇到了相同的断开连接问题(至少从那时起它没有超时) "查验" websocket,即以特定间隔发送消息。
也许你可以在Javascript中使用这样的东西。
ws.onopen = () => {
ws.send(/** YOUR CODE */);
// Send a ping event every 10 seconds
setInterval(() => ws.send(JSON.stringify({ event: "ping" })), 10000);
}
并相应地在服务器端处理这个新的事件类型。您也可以尝试监视onclose
事件,并根据重新打开连接的原因。您可以在Mozilla docs。
答案 1 :(得分:1)
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会为你实现所有这些。这是一个非常小的lib。你会发现最后你用一堆你错了的东西实现了lib中的所有东西: - )