2012-03-31 4 views
-3

alle ich werde chatroom verwenden netty für server schreiben. und flash für den Client. Das Protokoll verwendet json string mit "\ r \ n" end.Ich schreibe drei Handler "MessageDecoder", "MessageHandler", "MessageEncoder". und verwenden Sie den Flash-Client, um eine Nachricht zu senden. aber ich bekomme folgende Fehler.Wie Netty für Chatraum zu verwenden. flash client

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; 

} 

ich nie Socket-Programm schreiben. nur wissen, verwenden Sie Multi Thread-Management-Socket. aber ich denke, es ist schrecklich. also benutze ich Netty. aber ich weiß nicht, wie man es für Chatroom benutzt.

kann mir jemand empfehlen?

+0

Bitte geben Sie die vollständige Quelle der Klasse MessageDecoder. – Vincent

Antwort

1

Stellen Sie sicher, dass Sie den Leserindex des empfangenen ChannelBuffer an der Position positionieren, an der die gerade gelesene Nachricht endet. @see ChannelBuffer.readerIndex (int) Dies liegt daran, dass ChannelBuffer.getByte (int)/.getBytes() den Leserindex nicht ändert.

Wenn nicht, nimmt Netty an, dass Sie keine Bytes aus dem Puffer gelesen haben (übergeben Sie sie dem nächsten Handler in der Pipeline, falls es einen gibt) und werfen Sie die gerade gefundene Excurce.

0

Ich würde vorschlagen, dass Sie die integrierte Funktionalität für den Umgang mit Zeichenfolgen innerhalb der Netty API verwenden.

  • DelimiterBasedFrameDecoder
  • StringDecoder
  • StringEncoder

Ich habe versucht, Links zu den entsprechenden Seiten der Dokumentation zu erstellen, aber Stackoverflow verhindert mich von mehr als zwei Links veröffentlichen.

Die Netty SecureChat Example bietet eine ziemlich klare Erklärung, wie diese Handler auf Ihrer Kanalpipeline verwendet werden.

+0

. es ist der beste Weg. – fred

1

Ersetzen Sie einfach buffer.getByte (..) mit buffer.readByte(), um dies zu beheben.

Verwandte Themen