2014-03-25 40 views
2

我正在使用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重新連接問題再出來。

回答

0

已解決在EthClientHandler類中的ctx.writeAndFlush(message)之前在channelActive之前添加一個暫停。

@Override 
public void channelActive(final ChannelHandlerContext ctx) { 

    ctx.channel().eventLoop().schedule(new Runnable() { 
     @Override 
     public void run() { 
      ctx.writeAndFlush(message); 
     } 
    }, 1, TimeUnit.SECONDS); 
} 

感謝您的幫助

3

StringDecoder需要在它前面的成幀解碼器。放置一個LineBasedFrameDecoder以正確處理文本行。

StringEncoder不會爲您追加"\r\n"。如果你沒有,請做。

這兩個變化可能會使它工作。

+0

@trustin嗨,協議字符串,我發送給它完成了EOT(\ U0004): '字符串消息= 「\ u0002N \ U0004」' 我把新在引導程序中使用DelimiterBasedFrameDecoder(2048,true,Unpooled.copiedBuffer(「\ u0004」.getBytes())),並在啓動時讀取它,但如果嘗試斷開連接並重新連接,它仍然不起作用。 – mrlele