2012-10-26 33 views
6

Xin chào Tôi có một Netty Server với một trình xử lý chấp nhận chuỗi. Có vẻ như chỉ nhận nội dung tối đa 1024 byte. Làm thế nào tôi có thể tăng kích thước bộ đệm. Tôi đã thửNetty Tăng ChannelBuffer Size

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

không thành công.

Việc xử lý như sau

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

}

Trả lời

7

Bạn đang sử dụng UDP? Nếu vậy, các gói tin sẽ tối đa ở mức 1024 byte. Nhận xét mã này nằm trong mẫu mã QOTM:

Cho phép các gói lớn tới 1024 byte (mặc định là 768). Bạn có thể tăng hoặc giảm giá trị này để tránh các gói bị cắt bớt hoặc để cải thiện dấu chân bộ nhớ tương ứng.

Cũng xin lưu ý rằng một gói UDP lớn có thể bị cắt hoặc bỏ bởi bộ định tuyến của bạn bất kể bạn định cấu hình tùy chọn này như thế nào. Trong UDP, gói bị cắt bớt hoặc bị xóa nếu kích thước lớn hơn một kích thước nhất định, tùy thuộc vào cấu hình bộ định tuyến. Bộ định tuyến IPv4 cắt ngắn và IPv6 bộ định tuyến thả một gói lớn. Đó là lý do tại sao nó an toàn để gửi các gói nhỏ trong UDP.

Nếu bạn đang sử dụng TCP, bạn nên thêm bộ giải mã khung và bộ giải mã chuỗi vào đường dẫn trước khi xử lý; Một cái gì đó như thế này:

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

Tâm trí bạn, bạn sẽ cần phải sửa đổi trình xử lý kiểm tra của bạn vì MessageEvent thực sự chứa chuỗi của bạn.

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

Có ý nghĩa?

+0

Cảm ơn Nicholas. Bây giờ tôi nhận thấy rằng dòng cuối cùng không được in. Tại sao? – ukuta

+0

Câu hỏi hay. Bạn có thể đặt dấu phân cách cuối dòng đầy đủ ở cuối dòng cuối cùng không? – Nicholas

+1

Cảm ơn Nicholas. Có thể sử dụng chu vi của riêng tôi. Rực rỡ!!! Đây là hướng dẫn MUST-READ của Nicholas. http: //seeallhearall.blogspot.kr/2012/06/netty-tutorial-part-15-on-channel.html ... p.addLast ("frameDecoder", mới DelimiterBasedFrameDecoder (8192, ChannelBuffers.wrappedBuffer ("" .getBytes()))); – ukuta

4

Trong phiên bản 4.0.10.Đối với kích thước bộ đệm UDP được đặt thành 2048 byte.

Nếu bạn muốn tăng nó thiết lập ChannelOptions như sau:

option(ChannelOption.SO_RCVBUF, int bytes) 

và cũng

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

Vị trí của điều này đã thay đổi một chút kể từ 4.0.10, ' channel(). config(). setOption (ChannelOption.SO_RCVBUF, numOfBytes); 'Cảm ơn, chúc mừng. –