2012-10-26 23 views
6

你好,我有一個Netty服務器,應該接受字符串的處理程序。它似乎只接收高達1024字節的內容。我怎樣才能增加緩衝區大小。我已經試過Netty增加ChannelBuffer大小

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

沒有成功。

的處理程序如下

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(); 
} 

}

回答

7

是否使用UDP?如果是這樣,數據包將在1024字節時最大。此代碼註釋位於QOTM代碼示例中:

允許最大爲1024個字節(默認值爲768)的數據包。您可以通過增加或減少此值來避免截斷的數據包,或者分別增大或減小內存佔用量。

另請注意,無論您如何配置此選項,大型UDP數據包可能會被路由器截斷或丟失 。在UDP中,如果 數據包大於特定大小,則該數據包將被截斷或丟棄,該數據包取決於路由器配置,即 。 IPv4路由器截斷和IPv6 路由器丟棄一個大包。這就是爲什麼在UDP中發送小包 是安全的。

如果您使用的是TCP,您應該在處理程序之前將一個幀解碼器和一個字符串解碼器添加到您的管道中;例如:

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

請注意,您需要修改測試處理程序,因爲MessageEvent實際上將包含您的字符串。

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

有意義嗎?

+0

感謝尼古拉。現在我注意到最後一行沒有打印。爲什麼? – ukuta

+0

好問題。你能在最後一行的末尾加上一個完整的行尾分隔符嗎? – Nicholas

+1

謝謝尼古拉斯。有可能使用我自己的分隔符。輝煌!!!這是Nicholas的必讀教程。 http://seeallhearall.blogspot.kr/2012/06/netty-tutorial-part-15-on-channel.html ... p.addLast(「frameDecoder」,new DelimiterBasedFrameDecoder(8192,ChannelBuffers.wrappedBuffer(「」 .getBytes()))); – ukuta

4

在版本4.0.10.Final中,UDP緩衝區大小設置爲2048字節。

如果你想增加它設置ChannelOptions如下:

option(ChannelOption.SO_RCVBUF, int bytes) 

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

自4.0.10以來,這個位置已經發生了輕微的變化,'' channel().config()。setOption(ChannelOption.SO_RCVBUF,numOfBytes);'謝謝,歡呼聲。 –