2014-09-10 1 views
5

Netty에서 첫 걸음을 내딛겠습니다. Netty에서 간단한 서버를 작성하고 일반 TCP에 간단한 클라이언트를 작성했습니다.Netty channel.write not write message

클라이언트가 임의의 텍스트 패킷을 보내고 "ack"메시지를 수신해야합니다. 핸들러 방법을 참조하십시오

@Override 
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 

    ctx.write("Ack"); 
    ctx.flush(); 

    ByteBuf in = (ByteBuf) msg; 
    StringBuilder sb = new StringBuilder(); 
    try { 
     while (in.isReadable()) { 
      sb.append((char) in.readByte()); 

     } 
    } finally { 
     ReferenceCountUtil.release(msg); 
    } 
    LOG.debug("Incoming message. ACK was send"); 

    String myaddr = ctx.channel().remoteAddress().toString(); 
    String message = "Message from " + myaddr + " :" + sb.toString(); 
    LOG.debug(message); 
    sendToOther(myaddr, message); 

} 

문제는 - 내가 "긍정"문자열을 다시 보내려고 할 때 - 클라이언트는 아무것도받지 않습니다. 하지만 메시지를 다시 보내려고 할 때 - 수신이 잘되고 클라이언트에서 에코가 보입니다.

@Override 
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 

    ctx.write(msg); 
    ctx.flush(); 

write() 메소드가 필요하며 Object (String)을 보내려고했지만 아무 일도 없었습니다. ByteBuf (한 기사에서 보았습니다)를 보내려고했지만 여전히 작동하지 않습니다.

들어오는 메시지를 에코로 다시 보내면 작동합니다. 내가 다른 곳으로 보낼 때 - 그렇지 않습니다. 제발 도와주세요, 제 실수가 어디인지는 모르겠습니다.


이 문제가 해결되었습니다. 요점은 ByteBuff 만 보내야한다는 것입니다. 그래서 우리는 그것을 만들고, 그것에 어떤 것을 쓰고 그 후에 만 ​​그것을 샤넬 파이프에 쓸 수 있습니다. 내 경우에는 다음과 같았습니다 :

String ack = "ACK"; 
    ByteBuf out = ctx.alloc().buffer(ack.length()*2); 
    out.writeBytes(ack.getBytes()); 
    ctx.write(out); 
    ctx.flush(); 
    LOG.debug("Incoming message. ACK was send"); 

이것은 가능한 해결책이 아니지만 예제로 작동합니다. 실패 이유를 다음과 같이 당신의 serverHandler에

ctx.write("Ack"); 
ctx.flush(); 

를 교체 할 경우

답변

16

당신은 볼 수 있습니다 :

ChannelFuture cf = ctx.write("Ack"); 
ctx.flush(); 
if (!cf.isSuccess()) { 
    System.out.println("Send failed: " + cf.cause()); 
} 

그것은 당신에게 String이 지원되지 않음을 알리는 메시지를 제공해야합니다.

ByteBuf하지만 작동합니다 : 클라이언트 측 편집에

ctx.write(Unpooled.copiedBuffer("Ack", CharsetUtil.UTF_8)); 
ctx.flush(); 

channelRead 방법 :

ByteBuf in = (ByteBuf) msg; 
System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8)); 
+0

고맙습니다 당신의 대답을! 당신의 해결책은 나보다 훨씬 낫다. – Asprelis

관련 문제