Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Websocket超时过快_Javascript_Sockets_Websocket_Elixir_Phoenix Framework - Fatal编程技术网

Javascript Websocket超时过快

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

我已经设置了一个标准的Phoenix websocket/频道环境,但我没有使用提供的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'
  }));
};

更新:我最终使用了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如何敲入频道以保持套接字的连接处于唤醒状态。