Websocket太快超时

时间:2017-01-31 10:30:11

标签: javascript sockets websocket elixir phoenix-framework

我已经设置了一个标准的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文件,大家建议 - 它只是做我需要的一切。感谢所有回答:)的人。

2 个答案:

答案 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中的所有东西: - )