2010-07-12 1 views
0

J'ai le code simple suivant dans mon projet netty, il s'attend à lire un entier de l'amont. Aucun codeur n'est dans le pipeline.Étrange indexOutOfBound erro de Netty's ChannelBuffer.read?

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { 
     ChannelBuffer m = (ChannelBuffer) e.getMessage(); 

     m.readInt() 
    } 

Lorsque les données vient du réseau de la méthode est correctement tiré (bon signe), mais en essayant de lire, il donne l'erreur suivante:

java.lang.IndexOutOfBoundsException 
    at org.jboss.netty.buffer.AbstractChannelBuffer.checkReadableBytes(AbstractChannelBuffer.java:657) 
    at org.jboss.netty.buffer.AbstractChannelBuffer.readInt(AbstractChannelBuffer.java:272) 
    at PushServer.Netty.PushClientHandler.messageReceived(PushClientHandler.java:33) 
    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:349) 
    at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:281) 
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:201) 
    at org.jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java:46) 
    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:637) 

Toutes les idées?

+0

Checkm pour 'm.readable()'. – whiskeysierra

Répondre

3

Peut-être n'avez-vous pas de décodeur dans votre pipeline? Même si votre homologue a écrit 4 octets, vous pouvez obtenir moins de 4 octets, et il y a donc de fortes chances d'obtenir un IOOBE. En fait, a section in the official user guide explique exactement le même cas.