gpt4 book ai didi

java - Netty客户端不发送数据

转载 作者:太空宇宙 更新时间:2023-11-04 09:09:48 27 4
gpt4 key购买 nike

我正在尝试开发一个 REST API 客户端-服务器。我的客户端使用 Java 和 Netty,我的服务器使用 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握手成功,但是没有发送 POST 数据。
  • 我认为这在某种程度上与请求数据的数据长度有关长度小于 150 字节则一切正常。
  • Netty 还报告发送操作已完成(如“发送完成”显示在我的日志文件中)。

这里是否有人遇到过同样的问题或者知道如何解决这个问题。任何帮助将不胜感激。

最佳答案

我遇到了一个问题,当使用异步方式时,netty 会吞掉异常,甚至用“发送完成!”来完成 future。但我的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.xxxxx.ProxyClient.operationComplete() 引发异常java.lang.UnsupportedOperationException:不支持的消息类型:[B(预期:ByteBuf、FileRegion)

结果我需要 writeAndFlush(Unpooled.wrappedBuffer(new byte[10])) 包装我的数组。

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

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

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

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

希望你审视一下自己的 future ,或许也能找到原因。

关于java - Netty客户端不发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59786786/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com