Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Зипованный файл битым прилетает..


Автор: Proger10 22.3.2009, 01:59
С сервера кидаю бинарный файл на клиент. Всё через сокеты. Файл предварительно гзипую.
Серверный код:
Код
try {

    String line;
    GZIPOutputStream zip = new GZIPOutputStream( socket.getOutputStream() );
    BufferedReader bis = new BufferedReader( new FileReader( "etalon-file.png" ) );
    int i = 0;
    while ( true ) {

        try {
            line = bis.readLine();
            if ( line == null )
                break;
            if ( i > 0 ) {
                line = "\n" + line;
            }
            zip.write( line.getBytes(), 0, line.length() );
            i++;
        } catch ( Exception e ) {
            break;
        }

    }

}


приём у клиента:
Код
try {

    int length;
    int sChunk = 8192;
    GZIPInputStream zip = new GZIPInputStream( socket.getInputStream() );
    FileOutputStream out = new FileOutputStream( "test.png" );

    byte[] buffer = new byte[ sChunk ];

    while ( ( length = zip.read( buffer, 0, sChunk ) ) != -1 ) {
        out.write( buffer, 0, length );
    }

    out.close();
    zip.close();

} catch ( IOException e ) {
}


Код
ls -la
-rw-r--r-- 1 user user 26846 Мар 22 01:27 etalon-file.png
-rw-r--r-- 1 user user 26845 Мар 22 01:33 test.png


вот чёрт побери.. один байт решает. 26845 - это размер файла в байтах.
Не пойму, в чём может быть дело??
Визуально смотрю - всё почти тоже самое. Только в одном файле два символа - вопросы, а в битом файле test.png почему-то эти символы в виде вопроса в ромбике smile визуально больше отличий нет, кол-во строк одинаковое...

Не подскажите ли в чём моя ошибка??

Автор: Proger10 22.3.2009, 02:21
Может потоки (/сокеты) как-то подготовить особо надо, чтобы передавать?

Всё же 1 байт разницы это в чём-то таком дело.. либо типы неправильные использую, либо ещё какая-то несовместимость.. Либо действительно у меня в программе ошибка. Но вряд ли, всё-таки файл приходит почти такой же.. тока битый smile

Причём меньше именно полученный файл. Вот больше объёмы:
Код
-rw-r--r-- 1 user user 97733 Мар 22 02:21 received-file.png
-rw-r--r-- 1 user user 97736 Мар 22 02:21 etalon-file.png

Видите, терь 3 байта сэкономили.. smile Добавлено: точнее, 3 байта экономим когда sChunk = 50000, а вот когда он равен 8192, тогда снова 1 байт пропадает:
Код
ls -la
-rw-r--r-- 1 user user 130662 Мар 22 02:34 received-file.png
-rw-r--r-- 1 user user 130663 Мар 22 02:34 screen-1.png

Господа гуры, предположите хоть что-нибудь! smile

Автор: Proger10 22.3.2009, 02:47
Заменил у клиента вот на такое:
Код
while ( ( length = zip.read( buffer, 0, 1 ) ) > -1 ) {

вместо sChunk поставил еденицу - работает абсолютно аналогично. Опять 1 байт теряется. То, что он аналогично работает, это нормально? smile

Автор: qwertovsky 22.3.2009, 02:48
Насколько я сталкивался, в архивы получалось писать только блоками по 8Киб.
Как ты так странно с файлом двоичным - построчно, да еще и перенос строки сам добавляешь?

Автор: Proger10 22.3.2009, 02:58
Цитата
Как ты так странно с файлом двоичным - построчно, да еще и перенос строки сам добавляешь?

Я чё-то и сам не подумал!! smile Спать уже наверное пора.
Дал я маху.. Да и Ридеры/Райтеры не работают с бинарными данными.

Проблема решена!

На всякий случай, привожу работающий код сервера - пользуйтесь кому надо! smile
Код
try{

    String line;
    GZIPOutputStream zip = new GZIPOutputStream( s.getOutputStream() );
    FileInputStream fis = new FileInputStream( "etalon-file.png" );

    int c;
    while( ( c = fis.read() ) != -1 ) {
        zip.write( c );
    }

    zip.finish();
    zip.close();

} catch ( IOException e ) {
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)