これはおそらく簡単ですが、私はそれを理解できませんでした。Netty 4ベースのhttpサーバーが原因で、httpクライアントが応答を停止しています。(クライアントとしてcurlを使用して観察されたように)応答ペイロードを介して送信することができますが、クライアントは応答が終了したことに気付いていないようで、応答が完了するのを無期限に待ちます。カール、Firefox、クロームを使用して観察されました。
チャンネルを閉じるようにコードを変更した場合(以下のインラインで見られるように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)
}
})
何が足りないの?