2014-01-07 3 views
3

Я отправляю MultiPart на мой удаленный сервер, чтобы сохранить его в файловой системе. Для этого я использую протокол Java TCP/IP. Для избежания пропускной способности сети и буферной памяти ввода/вывода TCP, я отправляю данные в сжатом формате GZIP. Но я не могу распаковать данные, полученные от клиента. Я получил Unexpected end of ZLIB input stream Исключение. В связи с этим сервер получает данные в chunks.TCP Socket отправлять данные в формате сжатия GZIP

Java Code

Client

OutputStream out = new GZIPOutputStream(sock.getOutputStream()); 
    byte[] dataToSend = FileUtil.readFile(new File("/Users/bharathi/Downloads/programming_in_go.pdf")); 
    out.write(dataToSend); 

Сервер

out = new FileOutputStream("/Users/bharathi/Documents/request_trace.log"); 
    InputStream in = new GZIPInputStream(clntSocket.getInputStream()); 
    int totalBytesRead = 0; 
    int bytesRead; 
    byte[] buffer = new byte[BUFFER_SIZE]; 

    while ((bytesRead = in.read(buffer)) != -1) 
    { 
     out.write(buffer , 0 , bytesRead); 
     totalBytesRead += bytesRead; 
    } 

Есть ли решение для передачи данных в сжатом формате GZIP в сокет?

+1

Возможно, вы захотите изменить свой протокол, чтобы сначала отправить размер для чтения. –

ответ

3

GZIPOutputStream генерирует GZIP file format, что означает, что другой конец должен получить полный поток (который является файлом), прежде чем он сможет его обработать, это причина вашей ошибки.

Если вы хотите на самом деле сделать передачу данных на потоке, сбросьте gzip и пойдите для zlib, я считаю, Zlib compression Using Deflate and Inflate classes in Java отвечает, как это сделать.

+0

Он не будет работать для потоков Socket. Мы получаем данные в кусках. Решение было бы, я должен ждать получения всех данных. В этом случае память - моя забота. – kannanrbk

+0

Что не сработает? Zlib? конечно, Zlib работает под Sockets see - http://javatechniques.com/blog/compressing-data-sent-over-a-socket/ – nrathaus

0

Попробуйте добавить:

out.flush(); 
sock.shutdownOutput(); 

в код клиента.

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