Netty channel.write не пишет сообщение
Я пытаюсь сделать свои первые шаги с Netty, для этого я написал простой сервер на Netty и простой клиент на oio plain TCP.
Клиент отправляет случайный текстовый пакет и должен получить сообщение «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);
}
Проблема - когда я пытаюсь отправить обратно строку «Ack» - клиент ничего не получает. Но когда я пытаюсь отправить обратно сообщение, что входящий - он работает нормально, и я вижу эхо в моем клиенте.
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ctx.write(msg);
ctx.flush();
Метод write () нуждается в Object, и я попытался отправить (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");
Может быть, это не отличное решение, но это работает как пример.