2014-10-20 1 views
0

Netty 클라이언트가 클라이언트 응용 프로그램과 서버 응용 프로그램 사이의 프록시 역할을하는 시나리오에서 Netty 4.0.19를 사용하고 ChannelOutboudHandler를 구현하려고합니다. 다음과 같이 보입니다.WebSocket과 함께 Netty에 ChannelOutboutHandler 구현

< 클라이언트 응용 프로그램> --- (웹 소켓) --------> < 웹 소켓 서버 = 전달 데이터 => Netty 클라이언트> ---- [netty 파이프 라인] - - [아웃 바운드 처리기 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] 특정 시나리오의 두 번째 아웃 바운드 핸들러가 활성화되지 않습니다. 내 테스트에서 에 중단 점이있을 때 작동합니다. readableBytes() 확인을 추가하여 ByteBuff으로 객체를 변환하기 위해 인코더를 추가하려고합니다. 그게 도움이 될까요? 아니면 위 코드에서 누락 된 부분이 있습니까?

2] 두 번째 처리기의 쓰기가 서버 응용 프로그램에 도달하지 않습니다. 이 문제를 어떻게 디버그 할 수 있으며 어떤 포인터가 도움이 될 것입니다.

3] 클라이언트 응용 프로그램에서 아무 것도 쓰지 않아도 웹 사이트 서버에서 netty 클라이언트로 전달되는 "유령"데이터가 있음을 확인했습니다. 나는이 데이터가 어디에서 왔는지 확실하지 않다 ?

위의 질문 중 하나 이상을 자유롭게 답해주십시오.

프라 사나

+0

@ norman-maurer 본인은 대부분의 게시물/프리젠 테이션/예를 읽거나 보았습니다. 매우 유용합니다. 그러나 ChannelOutboudHandlers에 대한 좋은 예를 찾을 수 없었습니다. 저에게 하나를 가르쳐 주시겠습니까? – Prasanna

+0

@trustin 나는 당신의 게시물과 예제도 읽었다. 그러니 자유롭게 통찰력을 공유하십시오. – Prasanna

답변

0

는 내 질문에 대한 답을 알아 낸 :

1, 그래서 검사를 수행하는 기존 솔루션을 유지]의 Netty는 ChannelOutboundHandler (들)과 함께 인코더를 추가 할 수 없습니다 충분한 읽을 수있는 바이트.

2] 잘못된 답을 읽으려고 할 때 버그가있었습니다.

3] "고스트"데이터가 없으므로 사용중인 테스트 프레임 워크가 추가 데이터를 보내고 있음을 발견했습니다.

관련 문제