Netty: должен ли я закрыть канал, если это соединение "keep-alive"?

Я пишу HTTP-сервер с Netty. Я устанавливаю параметр keep-alive при создании начальной загрузки сервера. bootstrap.setOption("child.keepAlive", true); Каждый раз, когда я пишу HTTP-ответ, я устанавливаю заголовок keep-alive и закрываю канал после написания ответа.

rep.setHeader("Connection", "keep-alive");
channel.write(rep).addListener(ChannelFutureListener.CLOSE);

Я не уверен, должен ли я закрыть канал.

2 ответов


предполагая, что вы пишете сервер HTTP 1.1, вы должны по умолчанию держать соединение открытым после отправки ответа. Если по какой-то причине вы решите закрыть его в любом случае, вы должны включить

Connection: close

в ответ.

отметим, что

bootstrap.setOption("child.keepAlive", true);

включает опцию keepalive на сокете и не имеет ничего общего с HTTP; скорее, это своего рода механизм сторожевого пса для обнаружения сломанных соединений в отсутствие " реального" трафик.


обратите внимание, что вам также необходимо указать длину содержимого:

  response.headers().set(CONTENT_LENGTH, response.content().readableBytes());

чтобы получатель мог выяснить, где закончилось сообщение. В противном случае получатель будет просто продолжать ждать сообщения.

и, чтобы быть ясным,вы не должны писать ".addListener (ChannelFutureListener.Закрыть); " если вы хотите, чтобы ваше соединение оставалось открытым.