Это, вероятно, просто, но я не мог понять это. Мой HTTP-сервер, основанный на Netty 4, заставляет HTTP-клиенты зависеть от ответа. Ему удается отправить свою полезную нагрузку ответа (как это наблюдается с помощью curl в качестве клиента), но клиенты, похоже, не понимают, что ответ завершен, и они бесконечно ждут завершения. Наблюдается использование завитка, а также firefox и chrome.Ответы сетевого сервера Netty
Только если я изменю код, чтобы закрыть канал (channel.close, как показано на рисунке ниже), то клиенты подтверждают, что ответ выполнен. В противном случае они просто продолжают ждать завершения. Я хочу, чтобы канал оставался открытым, так что следующий запрос клиента не потребует открытия нового соединения (я хочу иметь постоянное поведение), поэтому закрытие канала не представляется правдоподобным. Поэтому я не уверен, как сервер должен отмечать ответ как завершающий - без закрытия соединения.
Серверный код:
val response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK)
val buf = new StringBuilder
buf.append("hello")
response.data.writeBytes(Unpooled.copiedBuffer(buf, CharsetUtil.UTF_8))
ctx.write(response).addListener(new ChannelFutureListener(){
def operationComplete(channelFuture: ChannelFuture){
if (channelFuture.isSuccess){
println("server write finished successfully")
//channelFuture.channel.close <===== if uncommented, clients receive the response, otherwise they just keep waiting forever
}
else
println ("server write failed: " + channelFuture.cause + "\n" + channelFuture.cause.getStackTraceString)
}
})
Что мне не хватает ??
Вы отправляете заголовок Content-Length? – Kylar
Не совсем, я не активно добавляю заголовки. Нужно ли мне? – matanster
Да. Без заголовка Content-Length ваш клиент не знает, когда прекратить чтение. Если ваш контент просто «привет», добавьте: Content-Length: 5. – Kylar