Java Netty-客户端难以读取响应
我使用Netty 4向设备发送一个协议字符串,该设备应使用另一个协议字符串进行应答。我上过两门课,EthClient和EthClientHandler 客户:Java Netty-客户端难以读取响应,java,tcp,netty,Java,Tcp,Netty,我使用Netty 4向设备发送一个协议字符串,该设备应使用另一个协议字符串进行应答。我上过两门课,EthClient和EthClientHandler 客户: connection = new EthClientHandler(message); b.group(group) .channel(NioSocketChannel.class) .remoteAddress(host, port) .option(ChannelOption.TCP_N
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();
...
所以在最后一次确认之后,我没有收到任何其他信息,连接进入读取超时。
如果我在通道sturtup的ctx.writeAndFlush(message)
上的代码中放置断点,然后在一秒钟后恢复程序设备发送给我协议字符串:
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]
所以我真的不明白为什么会有这样的结果。有人知道我该怎么解决吗?这可能是一个棘手的问题或设备问题
编辑:
在引导处理程序中添加了
DelimiterBaseFramEdeCoder
,但结果不变。在第一次启动时,它从设备正确接收协议字符串,但如果我尝试断开e重新连接,问题会再次出现。StringDecoder
需要在它前面安装帧解码器。放置LineBasedFrameDecoder
以正确处理文本行
StringEncoder
不会为您附加“\r\n”
。如果你没有,请做
这两个更改可能会使它起作用。解决了在
channelActive
中的EthClientHandler类中的ctx.writeAndFlush(message)
之前添加暂停的问题
@Override
public void channelActive(final ChannelHandlerContext ctx) {
ctx.channel().eventLoop().schedule(new Runnable() {
@Override
public void run() {
ctx.writeAndFlush(message);
}
}, 1, TimeUnit.SECONDS);
}
感谢您的帮助Hi@trustin,我发送给它的协议字符串使用EOT(\u0004)完成:'string message=“\u0002N\u0004”'我将新的DelimiterBasedFrameDecoder(2048,true,unmooled.copiedBuffer(“\u0004.getBytes()”)放入引导程序中,并在启动时读取,但如果我尝试断开并重新连接,它仍然无法工作。
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]
@Override
public void channelActive(final ChannelHandlerContext ctx) {
ctx.channel().eventLoop().schedule(new Runnable() {
@Override
public void run() {
ctx.writeAndFlush(message);
}
}, 1, TimeUnit.SECONDS);
}