Подтвердить что ты не робот

Socket.io: Как обрабатывать закрывающие соединения?

Я пытаюсь понять, какие "физические" пределы моего приложения.

На стороне клиента:

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(), почему я все еще использую дескриптор файла (поэтому я ударил ограничение по файлу) edit: добавление задержки кажется, что сервер может держать дыхание и никогда не достигает предела файла)?
  • Есть ли способ полностью закрыть сокет, чтобы я мог быть уверен, что предел файла редко достигается (я знаю, что могу направить его на 65K)?
  • Есть ли способ узнать, что я достиг предела файла, чтобы я мог прекратить прием соединения?

Спасибо

4b9b3361

Ответ 1

Лучше, если клиент отправит команду "завершить" на сервер, который затем закрывает соединение, чем наоборот.

Сервер всегда будет ждать таймаута, прежде чем отказаться от соединения. Даже если этот тайм-аут невелик, с множеством подключений, он перегрузит его. Вот почему, например, всегда полезно отключить keep-alive на серверах приложений.

Задержка помогает, потому что у сервера есть время закрыть соединение, прежде чем открывать новый.