В Netty отправка сообщений выглядит так:
channel.writeAndFlush(new TextWebSocketFrame("Operation Succeed"));
запустить этот код, ничего ненормального. поэтому я думаю, что аргумент из writeAndFlush можно извлечь в статическую и конечную переменную следующим образом:
public class LogicHandler extends SimpleUserEventChannelHandler<WebSocketServerProtocolHandler.HandshakeComplete> {
static final TextWebSocketFrame SUCCEED = new TextWebSocketFrame("Operation Succeed");
@Override
protected void eventReceived(ChannelHandlerContext context, WebSocketServerProtocolHandler.HandshakeComplete arg) {
context.channel().writeAndFlush(SUCCEED.retain()); // the client received empty content
}
}
для запуска этих кодов, происходят ненормальные вещи:
Есть ли идеи, что я могу сделать с ним?
удалить метод «сохранить» не может решить проблему, единственный способ удалить статическое и окончательное ключевое слово.
взять больше использования и быть более эффективным. Я также пробовал ReferenceCountUtil.retain (сообщение), но бесполезно. Метод сохранения просто меняет внутреннее значение самого себя, объявление кажется без проблем. много таких сцен можно сделать.
Поскольку базовый индекс читателя ByteBuf обновляется после использования. Вы можете повторно использовать его, сбросив readerIndex, как показано ниже. Но этот код небезопасен для потоков, он может вызвать проблемы при наличии нескольких подключений.
public static class LogicHandler extends SimpleUserEventChannelHandler<WebSocketServerProtocolHandler.HandshakeComplete> {
static final TextWebSocketFrame SUCCEED = new TextWebSocketFrame("Operation Succeed");
@Override
protected void eventReceived(ChannelHandlerContext context, WebSocketServerProtocolHandler.HandshakeComplete arg) {
SUCCEED.content().readerIndex(0);
context.channel().writeAndFlush(SUCCEED.retain());
}
}
Это потокобезопасно
public static class LogicHandler extends SimpleUserEventChannelHandler<WebSocketServerProtocolHandler.HandshakeComplete> {
static final TextWebSocketFrame SUCCEED = new TextWebSocketFrame("Operation Succeed");
@Override
protected void eventReceived(ChannelHandlerContext context, WebSocketServerProtocolHandler.HandshakeComplete arg) {
context.channel().writeAndFlush(SUCCEED.retainedDuplicate());
}
}
спасибо. Сохраненный дубликат тоже не работает. тем не менее он возвращает пустую строку, но readerIndex (0) действительно работал, но небезопасен для потоков. я пытаюсь решить это
Тогда почему бы не удалить static/final, если это работает? Не уверен, почему вы используете сохранение, этот комментарий дает некоторое объяснение: stackoverflow.com/a/52884904/18703