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();
를 교체 할 경우
고맙습니다 당신의 대답을! 당신의 해결책은 나보다 훨씬 낫다. – Asprelis