我正在使用Netty 4將協議字符串發送到應該用另一個協議字符串回答的設備。我已經完成了兩個類,EthClient和EthClientHandler。Netty - 客戶端難以讀取的響應
EthClient:
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);
}
}
當開始連接其發送協議字符串,但設備不回答我。 使用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後,我沒有收到任何東西,並連接進去讀取超時。 如果我把一個斷點在我的代碼在ctx.writeAndFlush(message)
在通道sturtup和第二後,我恢復程序設備給我發協議字符串:
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問題或設備問題?
編輯: 新增DelimiterBasedFramdeDecoder
在引導處理,但結果並沒有改變。在第一次啓動它從設備接收正確的協議字符串,但如果我嘗試斷開e重新連接問題再出來。
@trustin嗨,協議字符串,我發送給它完成了EOT(\ U0004): '字符串消息= 「\ u0002N \ U0004」' 我把新在引導程序中使用DelimiterBasedFrameDecoder(2048,true,Unpooled.copiedBuffer(「\ u0004」.getBytes())),並在啓動時讀取它,但如果嘗試斷開連接並重新連接,它仍然不起作用。 – mrlele