2012-03-31 1 views
-3

все я напишу для использования в сети для netnet для сервера. и flash для клиента. В протоколе используется строка json с именем «\ r \ n». Я пишу три обработчика «MessageDecoder», «MessageHandler», «MessageEncoder». и используйте флэш-клиент, отправьте сообщение. но я получаю следующие ошибки.Как использовать netty для чата. flash-клиент

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 thread manage socket. но я думаю, что это ужасно. поэтому я использую netty. но я не знаю, как использовать его для чата.

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

+0

Просьба предоставить полный источник класса MessageDecoder. – Vincent

ответ

1

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

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

0

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

  • DelimiterBasedFrameDecoder
  • StringDecoder
  • StringEncoder

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

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

+0

thks. это лучший способ. – fred

1

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