3

これはおそらく簡単ですが、私はそれを理解できませんでした。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)
  }
})  

何が足りないの?

4

1 に答える 1

2

Content-Length ヘッダーが必要です。そうしないと、クライアントは読み取りを停止するタイミングがわからず、より多くのデータを継続的にポーリングします。

于 2013-02-20T17:29:15.653 に答える