gpt4 book ai didi

java - Netty - 客户端难读响应

转载 作者:可可西里 更新时间:2023-11-01 02:39:34 24 4
gpt4 key购买 nike

我正在使用 Netty 4 将协议(protocol)字符串发送到应该使用另一个协议(protocol)字符串进行应答的设备。我做了两个类,EthClient和EthClientHandler。

以太坊客户端:

connection = new EthClientHandler(message);
b.group(group)
.channel(NioSocketChannel.class)
.remoteAddress(host, port)
.option(ChannelOption.TCP_NODELAY, true)
.option(ChannelOption.SO_KEEPALIVE, true)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(
new DelimiterBasedFrameDecoder(2048, true, Unpooled.copiedBuffer("\u0004".getBytes())),
new StringEncoder(),
new StringDecoder(),
new ReadTimeoutHandler(READ_TIMEOUT, TimeUnit.SECONDS),
connection
);
}
});
f = b.connect();
f.channel().closeFuture();
...

EthClientHandler:

public class EthClientHandler extends SimpleChannelInboundHandler<String> {
private String message;

public EthClientHandler(message) {
this.message = message;
}

@Override
public void channelActive(ChannelHandlerContext ctx) {
ctx.writeAndFlush(message);
}

@Override
public void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
gestString(msg);
ctx.writeAndFlush(message);
}
}

当开始连接时它发送协议(protocol)字符串但设备不回答我。使用 Wireshark 了解设备是否回答了我发现的对话:

 445    2.835161000 192.168.1.135   192.168.1.252   TCP 54  49570 > exlm-agent [FIN, ACK] Seq=1 Ack=1 Win=65088 Len=0
454 2.871899000 192.168.1.252 192.168.1.135 TCP 60 exlm-agent > 49570 [FIN, ACK] Seq=1 Ack=2 Win=256 Len=0
455 2.871947000 192.168.1.135 192.168.1.252 TCP 54 49570 > exlm-agent [ACK] Seq=2 Ack=2 Win=65088 Len=0
617 3.835746000 192.168.1.135 192.168.1.252 TCP 66 49575 > exlm-agent [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=4 SACK_PERM=1
622 3.866775000 192.168.1.252 192.168.1.135 TCP 60 exlm-agent > 49575 [SYN, ACK] Seq=0 Ack=1 Win=256 Len=0 MSS=576
623 3.866839000 192.168.1.135 192.168.1.252 TCP 54 49575 > exlm-agent [ACK] Seq=1 Ack=1 Win=65088 Len=0
624 3.867209000 192.168.1.135 192.168.1.252 IPA 57 unknown 0x04 [Malformed Packet]
641 3.937626000 192.168.1.252 192.168.1.135 TCP 60 exlm-agent > 49575 [ACK] Seq=1 Ack=4 Win=256 Len=0

所以在最后一个 ACK​​ 之后我没有收到任何其他东西并且连接进入读取超时。如果我在 channel sturtup 的 ctx.writeAndFlush(message) 代码中放置一个断点,一秒钟后我恢复程序设备向我发送协议(protocol)字符串:

2036    13.113369000    192.168.1.135   192.168.1.252   TCP 66  51135 > exlm-agent [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=4 SACK_PERM=1
2037 13.144752000 192.168.1.252 192.168.1.135 TCP 60 exlm-agent > 51135 [SYN, ACK] Seq=0 Ack=1 Win=256 Len=0 MSS=576
2038 13.144833000 192.168.1.135 192.168.1.252 TCP 54 51135 > exlm-agent [ACK] Seq=1 Ack=1 Win=65088 Len=0
2069 13.319494000 192.168.1.135 192.168.1.252 IPA 57 unknown 0x04 [Malformed Packet]
2073 13.366926000 192.168.1.252 192.168.1.135 TCP 60 exlm-agent > 51135 [ACK] Seq=1 Ack=4 Win=256 Len=0
2092 13.458136000 192.168.1.252 192.168.1.135 IPA 72 unknown 0x30 [Malformed Packet]
2093 13.460564000 192.168.1.135 192.168.1.252 IPA 57 unknown 0x04 [Malformed Packet]
2102 13.514205000 192.168.1.252 192.168.1.135 TCP 60 exlm-agent > 51135 [ACK] Seq=19 Ack=7 Win=256 Len=0
2123 13.621507000 192.168.1.252 192.168.1.135 IPA 72 unknown 0x30 [Malformed Packet]

所以我真的不明白为什么会出现这样的结果。有人知道我该如何解决?可能是 Netty 问题或设备问题?

编辑:在 Bootstrap 处理程序中添加了 DelimiterBasedFramdeDecoder 但结果没有改变。第一次启动时,它从设备接收正确的协议(protocol)字符串,但如果我尝试断开连接并重新连接,问题又会出现。

最佳答案

StringDecoder 需要在它前面有一个帧解码器。放置一个 LineBasedFrameDecoder 来正确处理文本行。

StringEncoder 不会为您附加 "\r\n"。如果你没有,请做。

这两个更改可能会使它起作用。

关于java - Netty - 客户端难读响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22642892/

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