2014-01-09 2 views
2

У меня есть клиент, который отправляет измененные данные. Ожидается, что мой сервер прочитает эти данные. На сервере я использую Tomcat 7.0.42 и ожидаю, что эти данные будут загружены через существующий сервлет.Чтение записанных данных

Я искал google, чтобы узнать, могу ли я получить примеры, которые читают chunked данные, к сожалению, я не наткнулся на них.

Я нашел несколько ссылок на ChunkedInputStream, предоставленные Apache Http Client или ChunkedInputFilter, предоставленные Tomcat. Но я не мог найти достойных примеров того, как лучше их использовать.

Если у вас есть какие-либо проблемы с чтением/анализом фрагментированных данных, пожалуйста, разделите указатели вокруг них.

Java используется версия - 1.7.0.45

В моем существующем коде сервлета, я был обработки простого запроса через пост с помощью НИО. Но теперь, если клиент установил кодирование передачи в chunked, мне нужно специально обработать это. Так что у меня есть код forking. Что-то, как показано ниже,

inputStream = httpServletRequest.getInputStream(); 

if ("chunked".equals(getRequestHeader(httpServletRequest, "Transfer-Encoding"))) { 
    // Need to process chunked data 
} else { 
    // normal request data 
    if (inputStream != null) { 
    int contentLength = httpServletRequest.getContentLength() 
    if (contentLength <= 0) { 
     return new byte[0]; 
    } 
    ReadableByteChannel channel = Channels.newChannel(inputStream); 
    byte[] postData = new byte[contentLength]; 
    ByteBuffer buf = ByteBuffer.allocateDirect(contentLength); 
    int numRead = 0; 
    int counter = 0; 
    while (numRead >= 0) { 
     buf.rewind(); 
     numRead = channel.read(buf); 
     buf.rewind(); 
     for (int i = 0; i < numRead; i++) { 
      postData[counter++] = buf.get(); 
     } 
    } 
    return postData; 
    } 
} 

Так что, если вы заметили, нормальный запрос случай основан на «Content-Length» быть доступны, в то время как для фрагментированного кодирования, что нет. И, следовательно, альтернативный процесс обработки данных.

Спасибо,

Vicky

+1

Почему вы настаиваете на отводками НИО код на вершине 'java.io' кода? Нет ничего эффективного в этом: наоборот. Просто используйте потоки. И вы уверены, что вам нужно что-то делать? Я бы ожидал, что HttpServletRequest обработает блокировку из коробки. – EJP

ответ

0

См HTTP 1/1 Chunked Transfer Coding.

Вы сервлет будет обслуживаться кусками переменного размера. Вы получите размер каждого фрагмента в первой строке. Протокол прост, поэтому вы можете реализовать его самостоятельно.

+0

Я знаю формат и цель. Именно так, я смотрел, есть ли что-нибудь из коробки, доступное, как мой первоначальный поиск, бросил ChunkedInputStream или ChunkedInputFilter в качестве ссылок. Кроме того, я хочу использовать NIO api для этого, так как я использую AsyncContext. – Vicky

+0

Apache 'ChunkedInputStream' кажется идеальным выбором. Вы попробовали? –

+0

Нет, мне еще нужно попробовать. Просто хотел понять у людей, что это лучший способ сделать это. Если есть какие-то лучшие альтернативы. Как ChunkedInputFilter является частью tomcat, который я уже использую, но я не нашел много документации вокруг него. – Vicky

-1

После на основе НИО код работал для меня,

ReadableByteChannel channel = Channels.newChannel(chunkedInputStream); 

    // content length is not known upfront, hence a initial size 
    int bufferLength = 2048; 

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ByteBuffer byteBuffer = ByteBuffer.allocate(bufferLength); 

    int numRead = 0; 
    while (numRead >= 0) { 
     byteBuffer.rewind(); 
     //Read bytes from the channel 
     numRead = channel.read(byteBuffer); 
     byteBuffer.rewind(); 

     if (numRead > 0) { 
      byte[] dataBytes = byteBuffer.array(); 
      baos.write(dataBytes, 0, dataBytes.length); 
     } 

     byteBuffer.clear(); 
    } 

    return baos.toByteArray(); 
+3

Я не вижу ничего, связанного с разбором фрагментированных данных в этом коде. – Vadzim

Смежные вопросы