Angular Socket.io在角度应用中断开和重新连接

Angular Socket.io在角度应用中断开和重新连接,angular,socket.io,Angular,Socket.io,我有一个Angular 8应用程序,它与节点后端通信,并使用3.0.5从后端接收实时事件(使用3.0.4)。行动如下: 当用户登录时,将使用this.socket=io(API\u URL) 有些API调用需要很长时间才能完成(超过25秒),因此它们会通过web套接字连接不断发出信息消息,因此我可以在前端更新视图。我们通过传递一个channel\u id作为参数来实现这一点,它基本上是我们将侦听以获取消息的事件名称 在下图中,我显示了执行9个“编译”调用的批处理的输出: 前4个调用工作正常,接

我有一个Angular 8应用程序,它与节点后端通信,并使用3.0.5从后端接收实时事件(使用3.0.4)。行动如下:

  • 当用户登录时,将使用
    this.socket=io(API\u URL)
  • 有些API调用需要很长时间才能完成(超过25秒),因此它们会通过web套接字连接不断发出信息消息,因此我可以在前端更新视图。我们通过传递一个
    channel\u id
    作为参数来实现这一点,它基本上是我们将侦听以获取消息的事件名称
  • 在下图中,我显示了执行9个“编译”调用的批处理的输出:
  • 前4个调用工作正常,接收所有套接字消息。但是,突然,我看到socket.io库中的一些调用(从
    ?EIO=4&transport=polling
    )似乎取消了现有的websocket连接并启动了一个新的连接,如下图所示(很抱歉,套接字ID与前一个不同,因为这是另一次运行):

    我对API调用之间的套接字连接不做任何处理。该代码执行以下操作:

  • (在开始调用之前)创建一个
    channel_id
    ,并使用
    this.socket.on(channelId,(event:any)=>{…})开始监听它
  • 使用
    for
    循环,使用上述
    通道id
    逐个执行API调用
  • 所有通话结束后,使用
    socket.off
    从socket消息中“取消订阅”
  • 我已经做了很多测试,但我找不到断开连接的原因,我不知道还能看到什么。任何人都可以给我一些关于检查什么可以帮助我解决这个问题的建议


    非常感谢

    经过一些测试,我发现问题不在Angular应用程序中,而是在后端。编译过程是非常CPU密集的,尽管所有的内部逻辑都是通过承诺完成的,但节点服务器会过载,无法完成其余的任务。因此,当套接字“ping”消息到达时,服务器在接下来的5秒内无法响应,这被视为连接丢失,因此它尝试重新连接

    我已经解决了在服务器启动时增加ping间隔和超时的问题:

    const\u io:io.Server=新的io.Server(此.\u服务器{
    时间间隔:100000,
    平均超时时间:90000,
    });
    
    这只是一个临时补丁,因为解决方案是使用一些节点功能来处理CPU密集型任务(如工作线程),但这是另一个问题;)


    干杯,

    很好。您是否尝试将连接对象存储在变量中,并且变量连接对象的重用不为null?这样就避免了重试间隔。您的方式可能容易出现内存泄漏!我们在节点服务器启动时创建套接字io连接,并对所有连接的用户保持相同的连接,您的意思是这样吗?好的。当客户端发出连接请求时,如何创建新套接字?是的,当客户端登录时,我们使用
    this.socket=new io(API\u URL)
    创建一个新套接字。当用户注销时,我们关闭套接字连接。好的。我想那应该没问题。我想或者读到每当客户端发送消息、循环并取消订阅时,您都会创建或检查连接。如果未命中,此方法很容易发生泄漏