2014-07-24 1 views
2

나는 단지 Netty으로 시작하고 있으니, 정말 바보 같으면 저와 함께하시기 바랍니다.Netty를 통해 서버에서 클라이언트로 메시지를 보낼 수 없습니다.

클라이언트에 성공적으로 연결되면 클라이언트에게 ping 메시지를 보내도록 서버에 요청합니다. 이를 위해 ChannelInboundHandlerAdapter 클래스의 channelActive 메서드를 재정의했습니다. 클라이언트가 서버에 연결하면 "연결된 클라이언트"가 인쇄 된 것을 볼 수 있지만 어떻게 든 서버는 클라이언트에 메시지를 보내지 않습니다. 나는 여기서 정말로 잘못된 것을하고 있다고 생각한다. 누구든지 나를 도울 수 있습니까? 여기

는 서버 -에 코드의

public class ChatServerHandler extends ChannelInboundHandlerAdapter { 
    @Override 
    public void channelActive(final ChannelHandlerContext ctx) { 
     System.out.println("client connected"); 
     String msg = "ping"; 
     final ChannelFuture f = ctx.writeAndFlush(msg); 
     f.addListener(new ChannelFutureListener() { 
      @Override 
      public void operationComplete(ChannelFuture future) { 
       if(future.isSuccess()) { 
        System.out.println("Wrote message on active"); 
       } 
      } 
     }); 
    } 

클라이언트 코드 -

public class ChatClientHandler extends ChannelInboundHandlerAdapter { 

    @Override 
    public void channelRead(ChannelHandlerContext ctx, Object msg) { 
     System.out.println("Msg: " + (String)msg); 
    } 

    @Override 
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { 
     System.out.println("Exception...closing channel"); 
     ctx.close(); 
    } 
} 

문제는 내가 메시지가 channelRead()에 클라이언트에서 인쇄되는 표시되지 않습니다, 그래서 서버가 클라이언트에 메시지를 전송하지 않았다고 가정합니다.

코드의 다른 부분도 필요하면 알려주십시오. Netty 4.0.21을 사용하고 있습니다.

감사합니다.

답변

2

데이터를 보내려면 ByteBuf를 보내야합니다. 일반적으로 파이프 라인 시작 부분 근처의 파이프 라인에서는 메시지를 가져 와서 네트워크로 보내도록 ByteBuf로 바꾸는 인코더가 사용됩니다 .

netty 사용 설명서의 시간 서버 작성 섹션을 살펴보십시오. http://netty.io/wiki/user-guide-for-4.x.html

여기에서 ByteBuf에 시간 값을 래핑합니다. 예를 들어보십시오.

코멘트에 노먼에 의해 언급 한 바와 같이
String msg = "ping"; 
final ByteBuf byteBufMsg = ctx.alloc().buffer(msg.length()); 
byteBufMsg.writeBytes(msg.getBytes()); 
ctx.writeAndFlush(byteBufMsg); 

, 당신은 또한 파이프 라인에 StringEncoder를 추가 할 수 있습니다. 클라이언트 쪽에서 칭찬하는 StringDecoder도 있으므로 특히 좋습니다. ChatServerHandler 앞에 추가하면 예제에서와 같이 클래스를 유지할 수 있습니다.

파이프 라인 설정은 다음과 같습니다 (StringEncoder 예).

// Encoder 
pipeline.addLast("stringEncoder", new StringEncoder(CharsetUtil.UTF_8)); 
pipeline.addLast("chatServer", new ChatServerHandler()); 

클라이언트 파이프 라인에서.

// Decoders 
pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(80)); //This terminates strings on line endings, ie \n 
pipeline.addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8)); 
pipeline.addLast("chatClient", new ChatClientHandler()); 

그리고 msg를 being으로 업데이트하십시오. String msg = "ping \ n"; 줄 끝이 필요하므로 LineBasedFrameDecoder은 메시지를 올바르게 읽습니다.

다른 사용 가능한 인코더는 MessageToMessageEncoder 서브 클래스 목록과 사용 가능한 디코더의 경우 MessageToMessageDecoder에서 볼 수 있습니다.

+1

String-> ByteBuf의 인코딩을 처리 할 ChannelEncoder를 ChannelPipeline에 추가 할 수도 있습니다. –

+1

그 조각을 주셔서 감사합니다 @ NormanMaurer! 사용 가능한 인코더 중 일부를 설명하는 사용 설명서가 있다면 알고 있습니까?'MessageToByteEncoder'(http://netty.io/wiki/user-guide-for-4.x.html#wiki-h3-15)를 사용하는 것 이외의 다른 것을 보지 못했습니다. 자세한 내용은 [StringEncoder] (http://netty.io/4.0/api/io/netty/handler/codec/string/StringEncoder.html)에서 확인할 수 있습니다. 다른 인코더는 [MessageToMessageEncoder] (http://netty.io/4.0/api/io/netty/handler/codec/MessageToMessageEncoder.html) 하위 클래스에서 볼 수 있습니다. – Doswell

+0

입력에 감사하는 @NormanMaurer 및 업데이트 된 답변을위한 Doswell 매우 유용합니다. – gravetii

관련 문제