Как читать / писать с помощью netty, когда другая сторона использует readUTF / writeUTF? - PullRequest
1 голос
/ 25 января 2011

Я пытаюсь связаться с сервером, который использует DataInputStream.readUTF и DataOutputStream.writeUTF.

Я выполнил обычный загрузочный код для настройки моего клиента и установил следующий конвейерфакторией

    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    new LengthFieldBasedFrameDecoder(65536, 0, 2),
                    new StringDecoder(CharsetUtil.UTF_8),
                    new StringEncoder(CharsetUtil.UTF_8),
                    new MyClientHandler());
        }
    });

в MyClientHandler, который расширяет SimpleChannelUpstreamHandler, у меня есть следующее:

    boolean sent = false; //is this thread safe?

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
        logger.log(Level.INFO, e.getMessage().toString());
        e.getChannel().write("Hello over there!");

        if(!sent){
             //do something and set sent
        }
    }

Мне удалось получить сообщения от сервера успешно, но сервер не получает мое сообщение "привет там".Не уверен, что я мог упустить из виду.

Кроме того, обратите внимание на отправленное логическое значение, могу ли я добавить такие поля и работать с ними без проблем с потоками?

1 Ответ

3 голосов
/ 09 февраля 2011
  • Мне удалось получить сообщения от сервера успешно, но сервер не получает мое сообщение "привет там". Не уверен, что я мог упустить.

Поскольку сообщение от сервера можно было получить с помощью LengthFieldBasedFrameDecoder, сообщение имеет поле длины.

 +--------+----------+
 | Length | Message  |
 +--------+----------+

Следовательно, существует вероятность того, что сервер будет ожидать, что полученное сообщение имеет поле длины. Как, если поле длины записывается следующим образом?

 +--------+---------------------+
 | 0x0011 | "Hello over there!" |
 +--------+---------------------+

[образец]

@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
    logger.log(Level.INFO, e.getMessage().toString());
    byte[] message = "Hello over there!".getBytes("UTF-8");

    ChannelBuffer buf = ChannelBuffers.buffer(message.length + 2);
    buf.clear();
    short len = (short)message.length;
    buf.writeShort(len);
    buf.writeBytes(message);
    e.getChannel().write(buf);

    if(!sent){
        //do something and set sent
    }
}
  • Кроме того, обратите внимание на отправленное логическое значение, могу ли я добавить такие поля и работать с ними без проблем с потоками?

Да, вы можете добавить поля для хранения какого-либо состояния. И вам не нужно учитывать синхронизацию потока.

...