2014-04-28 3 views
0

netty HexDumpProxy 예제 (Netty 5 lib 사용)를 사용 중입니다. 각 메시지를 40 초마다 서버에 보내려고합니다. Netty를 사용하여이를 달성하는 방법. 이 문제를 해결할 수 있도록 도와주세요.Netty 스케줄링

업데이트 : 여기 은 ---------- 여기

protected void initChannel(SocketChannel sc) throws Exception { 

     int readerIdleTimeSeconds = 5; 
     int writerIdleTimeSeconds = 5; 
     int allIdleTimeSeconds = 0; 

     ChannelPipeline pipe = sc.pipeline(); 

//  pipe.addLast("rtspdecoder", new RtspRequestDecoder()); 
//  pipe.addLast("rtspencoder", new RtspResponseEncoder()); 

//  pipe.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); 
//  pipe.addLast("encoder", new StringEncoder()); 
//  pipe.addLast("decoder", new StringDecoder()); 

//  pipe.addLast("idleStateHandler", new IdleStateHandler(readerIdleTimeSeconds, writerIdleTimeSeconds, allIdleTimeSeconds)); 
//  pipe.addLast("idleStateEventHandler", new MyIdlestaeEvtHandler()); 

     pipe.addLast("decoder", new MyRtspRequestDecoder()); 
     pipe.addLast("encoder", new MyRtspResponseEncoder()); 

     pipe.addLast("handler", new PServerRequestHandler(remoteHost, remotePort)); 

     pipe.addLast("idleStateHandler", new IdleStateHandler(readerIdleTimeSeconds, writerIdleTimeSeconds, allIdleTimeSeconds)); 
     pipe.addLast("idleStateEventHandler", new MyIdlestaeEvtHandler()); 
    } 
이 MyIdlestaeEvtHandler 클래스, 내가 쓰는 아이들을 볼 수 있어요

public class MyIdlestaeEvtHandler extends ChannelDuplexHandler { 

    @Override 
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { 

     if(evt instanceof IdleStateEvent) { 

      IdleStateEvent e = (IdleStateEvent) evt; 
      if(e.state() == IdleState.WRITER_IDLE) { 
       String s = "Ping Pong!"; 
       ctx.channel().writeAndFlush(Unpooled.copiedBuffer(s.getBytes())); 
       System.err.println("writing idle------------------------"); 
      } else if(e.state() == IdleState.READER_IDLE) { 
       System.err.println("reading idle------------------------"); 
       String s = "Pong Pong!"; 
       ctx.channel().writeAndFlush(Unpooled.copiedBuffer(s.getBytes())); 
      } 
     } 
    } 
} 

내 initChannel 방법입니다 --------------하지만 서버 디버그 메시지에서이 메시지를 볼 수 없어서 서버로 전달되지 않습니다. 코드에 문제가 있습니까?

감사합니다

+0

가지고 당신은 API를 읽을 수 없습니다? – mangusta

답변

0

사용 IdleStateHandler. 자세한 내용은 해당 javadocs를 확인하십시오.

+0

내가 작업하고있는 상황은 다음과 같습니다. VLC를 클라이언트로 사용하고 HtdumpProxy를 controllChannel (메시지 트랜잭션 만)의 중재자로 사용하고 다른 끝으로 스트리밍 서버로 사용합니다. vlc에서 rtsp URL을 제공하고 재생을 클릭하면 명령 (메시지)이이 프록시 코드를 통과 한 다음 스트리밍 서버로 리디렉션됩니다. 프록시에서 메시지를 구문 분석하고 대상 IP 주소를 언급합니다. 따라서 스트리밍 서버는 rtp를 사용하여이 대상 IP 주소에서 스트리밍을 시작합니다. – user1241903

+0

기본적으로 내가하고 싶은 것은 vlc가 요청을하고 프록시에서 destionation IP 주소를 수정하고 스트리밍 서버로 보내고 스트리밍 서버가 해당 IP로 스트리밍을 시작합니다. 요청을 시작한 vlc는 유휴 상태가되어 스트림을 수신하지 않습니다. 이제는 스트리밍 서버 연결뿐만 아니라이 VLC 연결을 유지하면서 스트리밍 서버와 vlc (요청을 시작한 사람) 모두에게 일부 메시지를 보내 세션을 무효화하려고합니다. 이를 위해 vlc는 물론 주 서버를 프록시에서 보내야합니다. – user1241903

+0

IdleStateHandler를 사용하여이 작업을 수행하는 방법은 무엇입니까? 한 가지 예를 보여줄 수 있습니까? – user1241903

1

Netty 4.x는 채널의 이벤트 루프에서 scheduleAtFixedRate() 메소드를 사용하여 일정 비율로 실행되는 Runnable의 인스턴스를 예약하는 기능을 제공합니다. 예

see javadoc for scheduleAtFixedRate() in EventExecutorGroup

:

channel.eventLoop().scheduleAtFixedRate(new Runnable(){ 
     @Override 
     public void run() 
     { 
     System.out.println("print a line every 10 seconds with a 5 second initial delay"); 
     } 
    }, 5, 10, TimeUnit.SECONDS);