当前位置: 首页 > 面试题库 >

Socket.io:如何处理关闭的连接?

齐高阳
2023-03-14
问题内容

我试图了解哪些是应用程序的“物理”限制。

在客户端:

var socket = io.connect("http://127.0.0.1:6701");
socket.on('connect', function() {
  socket.disconnect();
});
socket.on('disconnect', function() {
  socket.socket.reconnect();
});

在服务器端:

var io = require('socket.io').listen(6701);

io.sockets.on('connection', function(socket) {

  socket.on('disconnect', function(reason) {
    var o = Object.keys(socket.manager.open).length
      , c = Object.keys(socket.manager.closed).length
      , cA = Object.keys(socket.manager.closedA).length
      , h = Object.keys(socket.manager.handshaken).length

      console.log("open: " + o)
      console.log("closed: " + c)
      console.log("handshaken: " + h)
      console.log("closedA: " + cA)
      console.log("---");
   });
});

在OSX中达到文件限制(256)时,统计信息如下

open: 471
closed: 235
handshaken: 471
closedA: 235

让我感到困惑的是:

  • 如果我强行关闭连接(这是我想对客户端执行的操作disconnect(),为什么我仍在使用文件句柄(因此达到文件限制),请执行以下操作:编辑:添加延迟似乎使服务器可以保持呼吸并且永远不会达到文件限制)?
  • 有没有一种方法可以完全关闭套接字,以便可以确定很少达到文件限制(我知道可以将其推到65K)?
  • 有没有办法知道我已达到文件限制,以便我可以停止接受连接?

谢谢


问题答案:

如果客户端向服务器发送一个“终止”命令,然后关闭连接,最好比其他方法更好。

服务器将始终等待超时直到放弃连接。即使超时很小,但有大量连接进入,它也会使它过载。例如,这就是为什么在应用程序服务器上禁用保持活动总是好的。

延迟有所帮助,因为服务器有时间在打开新连接之前关闭连接。



 类似资料:
  • 这个问题似乎不是关于特定的编程问题、软件算法或主要由程序员使用的软件工具。如果您认为这个问题在另一个Stack Exchange网站上是主题,您可以留下评论来解释这个问题在哪里可以得到回答。 我们构建了一个定制的Kafka Connect sink,它反过来调用一个远程REST API。我如何将背压传播到Kafka Connect基础设施,以便在远程系统比内部使用者向put()传递消息慢的情况下,

  • 问题内容: 我正在使用EF 6.1.0 我在下面将自定义DBContex对象作为DBEntites 我对上下文对象执行以下操作 但是在放置上下文对象之后,我仍然可以看到一个活动的数据库连接。在连接状态下,我可以看到该连接已经关闭(该连接从未为真)。 我正在使用以下查询来查看SQL上的连接。 在下面的语句中,增加了sql连接计数。但是即使处置了它也从未失败过。(我的意思是在使用块计算后,它应该关闭连

  • 问题内容: PHP中是否可以关闭连接(本质上告诉浏览器没有更多数据可用)但是可以继续处理。我正在考虑的特定情况是,我想提供缓存的数据,然后,如果缓存已过期,我仍然会提供缓存的数据以快速响应,关闭连接,但继续进行处理以重新生成并缓存新的数据数据。本质上,唯一的目的是使网站显得更具响应性,因为在用户等待内容重新生成时不会偶尔出现延迟。 更新: PLuS对我一直在寻找最接近的答案。为了澄清几个人,我正在

  • 我正在使用ActiveMQ对电子邮件进行排队,消费者读取队列并发送电子邮件。 在启动时,我注册一个生产者,并永远缓存它。 有时,当连接关闭时,生产者无法将消息加入队列。 有人能告诉我处理闭门会议的最佳方式吗?我应该重新注册我的制作人吗?还是有办法重开会话?

  • 我正在关注Quarkus-反应指南入门,并在使用服务器发送的事件的示例中与ClosedChannel异常进行斗争。resteasy资源处理程序使用vert。引擎盖下的x和netty以及反应流的SmallRye Mutiny库。 资源处理程序以1秒的间隔生成count条消息。 消息会根据请求发送到客户端。客户端是嵌入到html页面中的简单javascript函数: 在客户端,所有工作都按预期进行。事

  • 所以,场景是我正在做一些数据库操作,最后提交/回滚,然后连接关闭。但是连接关闭也会抛出SQLException。 在这种情况下,最好的方法是什么? 捕获并记录它。 捕获并抛出异常,以便调用函数可以处理它 在#1的情况下,调用函数永远不会知道出了问题。