2012-10-26 18 views
6

Ciao Ho un server Netty con un gestore che dovrebbe accettare stringhe. Sembra ricevere solo contenuti fino a 1024 byte. Come posso aumentare la dimensione del buffer. Ho già provatoNetty Increase Channel Dimensione buffer

bootstrap.setOption("child.sendBufferSize", 1048576); 
bootstrap.setOption("child.receiveBufferSize", 1048576); 

senza successo.

Il gestore è la seguente

public class TestHandler extends SimpleChannelHandler { 


@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 

    ChannelBuffer buf = (ChannelBuffer) e.getMessage(); 

    String response = ""; 

    if (buf.readable()) { 

     response = buf.toString(CharsetUtil.UTF_8); 
     System.out.println("CONTENT: " + response); 
    } 

    System.out.println(response); 


} 

@Override 
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { 
    e.getCause().printStackTrace(); 

    Channel ch = e.getChannel(); 
    ch.close(); 
} 

}

risposta

7

Stai usando UDP? In tal caso, i pacchetti raggiungeranno il limite massimo di 1024 byte. Questo codice di commento è nell'esempio di codice QOTM:

Consenti pacchetti fino a 1024 byte (il valore predefinito è 768). È possibile aumentare o diminuire questo valore per evitare pacchetti troncati o per migliorare rispettivamente il footprint della memoria.

Si noti inoltre che un grande pacchetto UDP potrebbe essere troncato o interrotto dal router, , indipendentemente da come è stata configurata questa opzione. In UDP, un pacchetto viene troncato o lasciato cadere se è maggiore di una determinata dimensione, a seconda della configurazione del router. I router IPv4 troncano e i router IPv6 rilasciano un pacchetto di grandi dimensioni. Ecco perché è sicuro inviare piccoli pacchetti in UDP.

Se si utilizza TCP, è necessario aggiungere un decodificatore di frame e un decodificatore di stringa nella pipeline prima di yout handler; Qualcosa di simile a questo:

pipeline.addLast("frameDecoder", new DelimiterBasedFrameDecoder(80960, Delimiters.lineDelimiter())); 
pipeline.addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8)); 
pipeline.addLast("myHandler", new TestHandler()); 

Intendiamoci, è necessario modificare il vostro gestore di prova perché il MessageEvent effettivamente contenenti la stringa.

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 
    String response = (String) e.getMessage(); 
    System.out.println(response); 
} 

Ha senso?

+0

Grazie Nicola. Ora noto che l'ultima riga non viene stampata. Perché? – ukuta

+0

Buona domanda. Puoi inserire un delimitatore di fine riga completo alla fine dell'ultima riga? – Nicholas

+1

Grazie Nicholas. È possibile utilizzare il mio delimitatore. Brillante!!! Questo è un tutorial MUST-READ di Nicholas. http: //seeallhearall.blogspot.kr/2012/06/netty-tutorial-part-15-on-channel.html ... p.addLast ("frameDecoder", nuovo DelimiterBasedFrameDecoder (8192, ChannelBuffers.wrappedBuffer ("") .getBytes()))); – ukuta

4

Nella versione 4.0.10. La dimensione del buffer UDP è impostata su 2048 byte.

Se si desidera aumentare ha fissato channelOptions come segue:

option(ChannelOption.SO_RCVBUF, int bytes) 

e anche

option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(int Bytes)) 
+0

La posizione di questo è leggermente cambiata dal 4.0.10, ' canale(). config(). setOption (ChannelOption.SO_RCVBUF, numOfBytes); 'Grazie, evviva. –

Problemi correlati