Java Netty-客户端难以读取响应

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

我使用Netty 4向设备发送一个协议字符串,该设备应使用另一个协议字符串进行应答。我上过两门课,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();
...
所以在最后一次确认之后,我没有收到任何其他信息,连接进入读取超时。 如果我在通道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);
}