c#客户端Java服务器HTTP无响应

本文关键字:响应 HTTP 服务器 客户端 Java | 更新日期: 2023-09-27 17:53:54

我们有一个java服务器应用程序,它在端口5545上监听http通信。

另一端是c#客户端应用程序,它向服务器发送请求。

在代理出现问题之前,我们的通信是基于TCP/IP的。

现在我们想切换到通过http进行通信,但是我们在c#端遇到了一些奇怪的行为。

问题是基于PostAsync方法

我们的Java服务器使用Netty 4框架和Spring。当c#客户端发布数据时,我可以看到netty日志中的所有内容。现在,在java服务器发送响应返回的部分,c#方法将进入死锁。

发送响应的java方法是

private boolean writeResponse(boolean isSuccessful, String message, ChannelHandlerContext ctx) {
  boolean keepAlive = HttpHeaders.isKeepAlive(_httpRequest);
  FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1,
    isSuccessful ? HttpResponseStatus.OK : HttpResponseStatus.BAD_REQUEST,
  Unpooled.copiedBuffer(message, CharsetUtil.UTF_8));
  response.headers().set(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.GZIP);
  response.headers().set(HttpHeaders.Names.CONTENT_TYPE, "application/octet-stream; charset=UTF-8");
  if (keepAlive) {
    response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, message.length());
    response.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
  }
  ctx.write(response);
  return keepAlive;
}
c#客户端代码为
HttpClientHandler httpClientHandler = new HttpClientHandler();
client = new System.Net.Http.HttpClient(httpClientHandler) { BaseAddress = uri };
byte[] bytes = ...
ByteArrayContent byteContent = new ByteArrayContent(bytes);
var response = await client.PostAsync(uri, byteContent, tokenSource.Token); 

当我添加ctx.channel().writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);在最后一次写入之后的Java端。PostAsync方法得到一个响应,否则它就卡住了,尽管java服务器已经发送了响应。

所以我的问题是,这是正常的行为还是有人能解释我,我们做错了什么?

c#客户端Java服务器HTTP无响应

每次都应该设置CONTENT_LENGTH,而不仅仅是当keepAlive为true时。

[编辑]否则,客户端不知道是否以及何时完全接收到响应内容,并且post方法将不会返回。