2014-10-20 19 views
0

我正在使用Netty 4.0.19,並試圖爲Netty客戶端充當客戶端應用程序和服務器應用程序之間的代理的場景實施ChannelOutboudHandler。它看起來是如下在Netty中實現ChannelOutboutHandler和WebSocket一起使用

<客戶端應用程序> ---(網絡接口)--------> <網絡套接字服務器=數據轉發=> Netty的客戶端> ---- [網狀管道] - - [out-bound handler 1] ----> <服務器應用程序>

在客戶端應用程序和服務器應用程序之間傳遞了兩條初始消息,這兩條消息需要ChannelOutboundHandler兩種類型。 位於客戶端和服務器應用程序之間的Netty客戶端負責 檢測交換消息的有效性權限。因此它讀取正在傳遞的消息並對消息內容進行檢查,並且一旦驗證它將在客戶端和服務器應用程序之間建立中繼通信。

的第一齣站處理程序(有趣的部分)如下:

@Override 
public void write(final ChannelHandlerContext ctx, 
     final Object msg, 
     final ChannelPromise promise) 
      throws Exception { 
    try { 
    buff = (ByteBuf) msg; 
     buff.order(ByteOrder.LITTLE_ENDIAN); 

     // TODO add the logic for readable bytes 

     ByteBuf helloBuff = null; 
     try { 
      helloBuff = buff.readBytes(Msg.SIZE).order(ByteOrder.LITTLE_ENDIAN); 
      Msg msg = new Msg(helloBuff); 

     } catch (Exception e) { 
      buff.release(); 
      if (helloBuff != null) { 
       helloBuff.release(); 
      } 

      log.error("Error while converting to a hello msg", e); 
      return; 
     } 

     ctx.writeAndFlush(helloBuff, promise) 
       .addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE) 
       .addListener(new ChannelFutureListener() { 
        @Override 
        public void operationComplete(ChannelFuture future) { 
         if (future.isSuccess()) { 
          ctx.channel().flush(); 
         } else { 
          future.channel().close(); 
         } 
        } 
       }); 

     final ChannelPipeline p = ctx.pipeline(); 
     p.replace(this,AnotherHandler.class.getSimpleName(), 
       createAnotherHandler(ID)); 
} catch (Exception e) { 
    log.error("Error occured", e); 
} finally { 
    buff.release(); 
} 

}

而第二個出站處理程序看起來很相似,只是只是它處理不同類型的信息和增加更多檢查。

最後我的問題:

1]在某些情況下,第二齣站處理程序,不會被激活。當我的測試中有 有斷點時,它可以工作。我正在考慮添加Encoders以將Object轉換爲ByteBuff並添加readableBytes()檢查。這會有幫助嗎?或者在我的上面的代碼中有什麼我錯過了?

2]我的第二個處理程序中的寫入沒有到達服務器應用程序。我怎樣才能調試這個問題,任何指針都會有幫助。

3]我注意到一些「鬼」數據從我的websocket服務器轉發到netty客戶端,即使客戶端應用程序沒有寫任何東西。我不確定這個數據是從哪裏來的?

請隨時回答上面的一個或多個問題。

人員Prasanna

+0

@ norman-maurer我已閱讀/觀看了您的大部分帖子/演示文稿/示例,這非常有幫助。但是我無法爲ChannelOutboudHandlers找到一個很好的例子,你能指點我嗎? – Prasanna 2014-10-20 19:52:47

+0

@trustin我也讀過你的文章和例子。所以請隨時分享一些見解。 – Prasanna 2014-10-20 19:55:01

回答

0

我想出的答案我的問題:

1]的Netty不允許與ChannelOutboundHandler(S)一起添加編碼器,因此保持現有的解決方案,我進行檢查有足夠的可讀字節。

2]我在測試中遇到了一個錯誤,因爲我試圖在錯誤的一端讀取響應。

3]沒有「幻影」數據,我發現正在使用的測試框架是發送額外的數據。