2015-01-16 3 views
0

게시 요청을 처리하기 위해 httpcomponenets nio 서버를 사용하고 있습니다.httpcomponents NIO 서버의 청크 요청을 읽는 방법?

다음은 샘플 코드입니다. EntityUtils.toByteArray()를 사용하여 바이트 배열로 완전한 데이터를 가져옵니다. 요청자가 큰 파일을 전송하면 실패합니다.

요청의 데이터를 청크로 읽는 방법을 알지 못했습니다. 는(). 읽기() 항상 당신이 요청 처리를 완벽하게 제어 할하려는 경우

public static void main(String[] args) throws Exception { 
     int port = 8280; 

     // Create HTTP protocol processing chain 
     HttpProcessor httpproc = HttpProcessorBuilder.create() 
      .add(new ResponseDate()) 
      .add(new ResponseServer("Test/1.1")) 
      .add(new ResponseContent()) 
      .add(new ResponseConnControl()).build(); 
     // Create request handler registry 
     UriHttpAsyncRequestHandlerMapper reqistry = new UriHttpAsyncRequestHandlerMapper(); 
     // Register the default handler for all URIs 
     reqistry.register("/test*", new RequestHandler()); 
     // Create server-side HTTP protocol handler 
     HttpAsyncService protocolHandler = new HttpAsyncService(httpproc, reqistry) { 

      @Override 
      public void connected(final NHttpServerConnection conn) { 
       System.out.println(conn + ": connection open"); 
       super.connected(conn); 
      } 

      @Override 
      public void closed(final NHttpServerConnection conn) { 
       System.out.println(conn + ": connection closed"); 
       super.closed(conn); 
      } 

     }; 
     // Create HTTP connection factory 
     NHttpConnectionFactory<DefaultNHttpServerConnection> connFactory; 

      connFactory = new DefaultNHttpServerConnectionFactory(
       ConnectionConfig.DEFAULT); 
     // Create server-side I/O event dispatch 
     IOEventDispatch ioEventDispatch = new DefaultHttpServerIODispatch(protocolHandler, connFactory); 
     // Set I/O reactor defaults 
     IOReactorConfig config = IOReactorConfig.custom() 
      .setIoThreadCount(1) 
      .setSoTimeout(3000) 
      .setConnectTimeout(3000) 
      .build(); 
     // Create server-side I/O reactor 
     ListeningIOReactor ioReactor = new DefaultListeningIOReactor(config); 
     try { 
      // Listen of the given port 
      ioReactor.listen(new InetSocketAddress(port)); 
      // Ready to go! 
      ioReactor.execute(ioEventDispatch); 
     } catch (InterruptedIOException ex) { 
      System.err.println("Interrupted"); 
     } catch (IOException e) { 
      System.err.println("I/O error: " + e.getMessage()); 
     } 
     System.out.println("Shutdown"); 
    } 
public static class RequestHandler implements HttpAsyncRequestHandler<HttpRequest> { 
    public void handleInternal(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException { 

     HttpEntity entity = null; 
     if (httpRequest instanceof HttpEntityEnclosingRequest) 
      entity = ((HttpEntityEnclosingRequest)httpRequest).getEntity(); 

     byte[] data; 
     if (entity == null) { 
      data = new byte [0]; 
     } else { 
      data = EntityUtils.toByteArray(entity); 
     } 

     System.out.println(new String(data)); 

     httpResponse.setEntity(new StringEntity("success response")); 
    } 

    @Override public HttpAsyncRequestConsumer<HttpRequest> processRequest(HttpRequest request, HttpContext context) throws HttpException, IOException { 
     return new BasicAsyncRequestConsumer(); 
    } 

    @Override 
    public void handle(HttpRequest request, HttpAsyncExchange httpExchange, HttpContext context) throws HttpException, IOException { 
     HttpResponse response = httpExchange.getResponse(); 
     handleInternal(request, response, context); 
     httpExchange.submitResponse(new BasicAsyncResponseProducer(response)); 

    } 
} 

답변

0

사용자 정의 AbstractAsyncRequestConsumer를 구현하는 대신 BasicAsyncRequestConsumer 고려하시기 바랍니다 null를 돌려 HttpEntity.getContent.

이러한 클래스를 시작점 [1] [2]으로 사용할 수 있습니다. 하나는 사용자 요청 소비자를 만들 같은 방법을 사용할 수 있지만 이러한 응답 소비자 있습니다 참고 :

[1] http://hc.apache.org/httpcomponents-asyncclient-4.1.x/httpasyncclient/xref/org/apache/http/nio/client/methods/AsyncCharConsumer.html

[2] 응답 http://hc.apache.org/httpcomponents-asyncclient-4.1.x/httpasyncclient/xref/org/apache/http/nio/client/methods/AsyncByteConsumer.html

+0

감사합니다. 나는 그것들을 점검 할 것이다. –