Можно ли объявить TextWebSocketFrame со статическим и окончательным?

В 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
    } 
}

для запуска этих кодов, происходят ненормальные вещи:

клиент (WebSocket из браузера Chrome) получил сообщение, но пустой контент



Есть ли идеи, что я могу сделать с ним?

удалить метод «сохранить» не может решить проблему, единственный способ удалить статическое и окончательное ключевое слово.

Тогда почему бы не удалить static/final, если это работает? Не уверен, почему вы используете сохранение, этот комментарий дает некоторое объяснение: stackoverflow.com/a/52884904/18703

Hace 09.12.2022 08:39

взять больше использования и быть более эффективным. Я также пробовал ReferenceCountUtil.retain (сообщение), но бесполезно. Метод сохранения просто меняет внутреннее значение самого себя, объявление кажется без проблем. много таких сцен можно сделать.

kiki 09.12.2022 13:58
Альтернативные WebSockets для netty/java: удвоение пропускной способности небольших сообщений
Альтернативные WebSockets для netty/java: удвоение пропускной способности небольших сообщений
Этот пост - краткая презентация netty-websocket-http1 - альтернативной netty/java реализации RFC6455 - протокола WebSocket.
Очень простая установка Websocket с помощью Deno без каких-либо пакетов
Очень простая установка Websocket с помощью Deno без каких-либо пакетов
Здесь мы рассмотрим, как можно использовать Websocket в Deno и развернуть его в Deno deploy. Мы будем слушать Websocket, а также отправлять сообщения.
0
2
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку базовый индекс читателя 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) действительно работал, но небезопасен для потоков. я пытаюсь решить это

kiki 14.12.2022 03:39

Другие вопросы по теме