Netty 客户端不发送数据



我正在尝试开发一个rest API客户端服务器。我的客户端是用 Netty 的 Java 和我的服务器使用 golang。 目前,我遇到了一个非常奇怪的问题,我的客户端在某些情况下不会将 POST 请求数据发送到服务器。

以下是详细信息:

- 我的部分客户端代码:

启动

Bootstrap b = new Bootstrap()
.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.option(ChannelOption.SO_KEEPALIVE, true)            
.remoteAddress(Host, Port)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline()
.addLast(new HttpClientCodec())
.addLast(new ClientHandler());
}
});
return b.connect().syncUninterruptibly().channel();

发送请求

if (channel.isActive() && channel.isWritable()) {
FullHttpRequest postRequest = new DefaultFullHttpRequest(
HttpVersion.HTTP_1_1,
HttpMethod.POST,
uri);
postRequest.headers().set(HttpHeaderNames.HOST, Host + ":" + Port);
postRequest.headers().set("Content-Type", "application/json; charset=UTF-8");
postRequest.headers().set(HttpHeaderNames.CONTENT_LENGTH, data.getBytes(StandardCharsets.UTF_8).length);
postRequest.content().writeBytes(data.getBytes(StandardCharsets.UTF_8));
ChannelFuture channelFuture = channel.writeAndFlush(postRequest);
channelFuture.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
logger.info("Send completed!");
}
});

- 我从调试中获得的一些信息

  • 当我在 IntelliJ 中运行代码时,一切正常,这只会发生 将其构建到 jar 文件中并从 jar 文件运行时。
  • 当我使用 wireshark 捕获包时,TCP 握手成功,但是 未发送开机自检数据。
  • 我认为这在某种程度上与请求数据的数据长度有关 长度小于 150 字节,那么一切都很好。
  • Netty 还报告发送的操作已完成(作为"发送完成" 显示在我的日志文件中(。

这里有没有人遇到过同样的问题,或者对如何解决这个问题有任何想法。 任何帮助将不胜感激。

我遇到了一个问题,在使用异步方式时,netty 会吞下异常,甚至用"发送完成!但是我的wireshark日志从未显示超过SYN->SYN,ACK->ACK流。

我的代码如下:

ChannelFuture channelFuture = channel.writeAndFlush(new byte[10]);
channelFuture.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
logger.info("Send completed!");
}
});

在我将代码更改为同步后,如下所示:

channel.writeAndFlush(new byte[10]).sync();

我终于发现实际上有一个错误:

[11:58:50] [战]xx.xxxx.xxx.ProxyClient.operationComplete(( 引发异常 java.lang.UnsupportedOperationException: unsupport 消息类型: [B (预期: ByteBuf, FileRegion(

事实证明,我需要writeAndFlush(Unpooled.wrappedBuffer(new byte[10]))包装我的数组。

所以我学到的是,异步方式会告诉你它是成功的!

但是等等,然后我发现它很可能没有吞下任何异常,只是我没有检查它!

@Override
public void operationComplete(ChannelFuture future) throws Exception {
if(!future.isSuccess()){
logger.info(future.cause());
}
}

因此,如果您更改未来的侦听器以检查isSuccess()并打印原因,它将显示相同的错误。

我希望,如果你检查你的未来,也许你也可以发现原因。

最新更新