2014-10-30 5 views
1

ByteBuf 초기 용량을 늘리는 방법을 알려주십시오.
에서 같은 상황 : ByteBuf의 최대 용량보다 소득 메시지보다 경우ByteBuf 초기 용량 크기

@Override 
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { 

    byte[] byteinput = new byte[in.readableBytes()]; 
    in.readBytes(byteinput); 

//further handling... 
} 

- 난의 cutted 데이터를 얻을. 이 프로젝트가 전체적이고 비 청크진 메시지를 얻는 것이 중요합니다.

ByteBuf의 초기 용량을 bootstraps childOptions 어딘가에 설정하거나 cannel.config() ... ChannelInitializer 내부에 설정해야한다고 가정합니다.
그리고 난

ch.config().setReceiveBufferSize(1024) 

설정과 같은 여러 가지 방법을 시도하지만 난 여전히 ByteBuf 용량 (예를 들면. 496)의 같은 값을 가지고있다.

UPD

나는 Wireshark를 내 프로토콜 트래픽을 발견하고, 내 테스트 사용자 클라이언트에서 밖으로와에서 손상되지 않은 것 1,4k까지 패킷. 이 문제는 netty 설정의 문제 일뿐입니다. 운영 체제 소켓 버퍼는 메시지를 자르지 않습니다.

+0

'수신 버퍼 크기'는 커널의 소켓 수신 버퍼 크기입니다. Netty, NIO 또는 Java와는 아무 관련이 없습니다. – EJP

+0

사실입니다. 하지만 현재 사용중인 컴퓨터의 경우 입력 소켓 버퍼가 8k 이상입니다. 내 메시지는 498 바이트로 줄어 듭니다. 그리고 ByteBuf 인스턴스 필드를 볼 때 "(최대) 용량 = 498"을 참조하십시오. 이 ByneBuf의 공장 또는 초기 설정이 어디에 있는지 찾아 초기 용량을 변경해야합니다. 1MB를 1 청크로 보내지 않으려 고합니다. 1k가 필요합니다. – Asprelis

답변

3

파이처럼 쉬웠습니다.

ServerBootstrap b = new ServerBootstrap(); // (2) 
     b.group(bossGroup, workerGroup) 
       .channel(NioServerSocketChannel.class) // (3) 
       .childHandler(new ChannelInitializer<SocketChannel>() { // (4) 
        @Override 
        public void initChannel(SocketChannel ch) throws Exception { 

         //decrypt //checknum 

         ch.config().setRecvByteBufAllocator(new FixedRecvByteBufAllocator(2048)); //set buf size here 
         ch.pipeline().addLast(new InboundDecryptor()); 
. 
. 
. 
1

Netty의 버퍼 할당 크기를 구성 할 수는 있지만보다 일반적인 제한 사항이있을 수 있습니다. Netty는 비동기 프레임 워크입니다. 즉, OS에서 사용 가능한 내용을 읽고이를 사용자에게 전달합니다. Netty는 네트워크 상태, 네트워킹 하드웨어 동작, OS 동작 또는 데이터 생산자와 Netty 응용 프로그램 사이의 다른 것을 제어하지 않습니다. 응용 프로그램 논리에 완전한 응용 프로그램 레벨 메시지가 필요한 경우이 응용 프로그램 논리를 호출하기 전에 데이터를 집계해야 할 수 있습니다. Netty는 이것을 돕기위한 몇 가지 편리한 방법을 가지고 있는데, MessageAggregator.java을 참조하고 HTTP 특정 구현은 HttpObjectAggregator.java을 참조하십시오.

+0

Intresting links.
내 앱은 최대 TCP 패킷 크기 (1400 바이트) 미만이지만 400 바이트를 초과하는 패킷을 수신합니다. 그래서 나는 내 메시지가 덩어리지지 않을 것이라고 생각한다. 소득 증대 만하면됩니다. ByteBuf 크기 – Asprelis

+0

귀하의 "가정"이라는 용어는 확실하지 않다는 것을 나타 냅니까? 메시지가 덩어리지지 않는다는 것을 어떻게 알 수 있는지에 대한 자세한 내용과 참조를 제공하면 다른 사람들에게 도움이 될 수 있습니다. 환경을 기술하는 것도 관련 될 수 있습니다 (예를 들어 일반 인터넷을 통해 진행되는 경우 또는 제어 된 환경에서 실행되는 경우 클라이언트/서버는 특정 OS 세트에서만 지원됩니다). –

+0

이제 모든 가능한 구성을 테스트 할 수 없으며 가능한 문제점을 염두에 두어야합니다. 그 이유는 내가 "함부로"라고 말한 이유는 그것을 단호하게 주장하지 않기 위해서입니다. 함정에 대해 모를 수도 있기 때문입니다. wireshark (정확한 네트워크 모니터링 프로그램) 목록을 조사하여 내 서버 포트에 대한 TCP 패킷을 확인했습니다. 서버와 클라이언트는 외부 네트워크를 통해 연결됩니다. 그래서 wireshark는 큰 패킷 (1,4 kB)이 전체적으로 나왔다는 것을 보여주었습니다. 시스템 Windows 7 x64 및 Android 3+; 서버/채널 초기화 프로그램의 여러 부분에서 매개 변수를 실험하기 시작했습니다. – Asprelis

0

Scott이 맞습니다. 버퍼의 크기 만 늘려도 문제는 해결되지 않습니다.

ch.config().setRecvByteBufAllocator(new FixedRecvByteBufAllocator(2048)); 

또한 HTTP 요청의 경우 HTTPObjectAggregator을 사용해야합니다. 그것은 나를 위해 일했습니다.

관련 문제