Angular Socket.io在角度应用中断开和重新连接
我有一个Angular 8应用程序,它与节点后端通信,并使用3.0.5从后端接收实时事件(使用3.0.4)。行动如下: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个调用工作正常,接
this.socket=io(API\u URL)
channel\u id
作为参数来实现这一点,它基本上是我们将侦听以获取消息的事件名称?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)
创建一个新套接字。当用户注销时,我们关闭套接字连接。好的。我想那应该没问题。我想或者读到每当客户端发送消息、循环并取消订阅时,您都会创建或检查连接。如果未命中,此方法很容易发生泄漏