Как использовать Netty для чата. флеш клиент - PullRequest
0 голосов
/ 31 марта 2012

все, что я напишу в чате использовать Netty для сервера.и прошить для клиента.В протоколе используется строка json с концом "\ r \ n". Я пишу три обработчика: MessageDecoder, MessageHandler, MessageEncoder.и с помощью флеш-клиента отправьте сообщение.но я получаю следующие ошибки.

 java.lang.IllegalStateException: decode() method must read at least one byte if it returned a frame (caused by: class com.mbaobao.chatroom.socket.handlers.MessageDecoder)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:294)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:216)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:351)
at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:282)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:202)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)

MessageDecoder

    protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer)
                                                                                            throws Exception {
    logger.debug("message decode");
    if (buffer.readableBytes() < 4) {
        return null;
    }

    StringBuffer stringBuffer = new StringBuffer();
    String json = null;
    for (int i = 0; i < buffer.capacity(); i++) {
        char c = (char) buffer.getByte(i);
        logger.info(c);
        stringBuffer.append(c);
        if (c == 13 || c == 10) {
            json = stringBuffer.toString();
            break;
        }
    }
    ChatData chatData = JSON.parseObject(json, ChatData.class);

    return chatData;

}

Я никогда не пишу программу сокетов.просто знайте, используйте mutil поток управления сокетом.но я думаю это ужаснопоэтому я использую нетти.но я не знаю, как использовать его для чата.

кто-нибудь может дать мне рекомендацию?

Ответы [ 3 ]

1 голос
/ 01 апреля 2012

Просто замените buffer.getByte (..) на buffer.readByte () чтобы это исправить.

1 голос
/ 01 апреля 2012

Убедитесь, что индекс считывателя полученного ChannelBuffer расположен в том месте, где заканчивается только что прочитанное сообщение.@see ChannelBuffer.readerIndex (int) Это потому, что ChannelBuffer.getByte (int) / .getBytes () не изменяет индекс читателя.

Если вы этого не сделаете, Netty будет считать, что вы не читалибайтов из буфера (передавая его следующему обработчику в конвейере, если он есть) и выбрасывает исключение, с которым вы только что столкнулись.

0 голосов
/ 01 апреля 2012

Я бы посоветовал вам использовать встроенную функциональность для работы с предоставленными строками. в Netty API.

  • DelimiterBasedFrameDecoder
  • StringDecoder
  • StringEncoder

Я пытался создать ссылки на соответствующие страницы документации, но stackoverflow мешает я от размещения более двух ссылок.

Пример Netty SecureChat дает довольно четкое объяснение того, как использовать эти обработчики на вашем канальный трубопровод.

...