Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> После пересылки файла сокет закрывается.. Это я его чтоль закрываю? :) 
:(
    Опции темы
Proger10
Дата 22.3.2009, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Передаю файл с сервера на клиент. Вот сервер:
Код
OutputStream os = null;
FileInputStream fis = null;

try{
    fis = new FileInputStream( file );
} catch ( FileNotFoundException e1 ) {}

try {

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

    os.flush();
    os.close();

} catch ( IOException e2 ) {}


вот клиент:
Код
try {

    int sChunk = 8192;

    InputStream is = socket.getInputStream();
    FileOutputStream out = new FileOutputStream( "file.png" );

    byte[] buffer = new byte[ sChunk ];
    int length;

    while ( ( length = is.read( buffer, 0, sChunk ) ) > -1 )
        out.write( buffer, 0, length );

    out.close();
    is.close();

} catch ( IOException e ) {
}


Вот так файл передаётся успешно, но после него закрывается сокет и более работа в него не возможна. А надо бы smile

То ли это я сокеты закрываю вот этими строками в конце:
os.close();
is.close();

Или эти строки сам сокет не должны закрывать?

Просто проблема в том, что если эти строки убрать, то сокет не закрывается.. хм.. но и файл почему-то не передаётся smile
А почему? Flush есть.. по идее должен ведь уходить клиенту.. В чём моя ошибка?

Это сообщение отредактировал(а) Proger10 - 22.3.2009, 23:49
PM MAIL   Вверх
codegen
Дата 23.3.2009, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



есть функция которая закрывает ввод
 
public void shutdownInput()  throws IOException
Places the input stream for this socket at "end of stream". Any data sent to the input stream side of the socket is acknowledged and then silently discarded. If you read from a socket input stream after invoking shutdownInput() on the socket, the stream will return EOF.

зачем тебе закрывать поток,если ты еще хочешь читать??? можно просто закрыть файл out.close(); а входной поток не закрывать.

но если на то пошло попробуй так:

out.close();
socket.shutdownInput();

Добавлено через 5 минут
рекомендую не парится и удалить строку is.close();
PM MAIL   Вверх
Kangaroo
Дата 23.3.2009, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 2
Всего: 104



Цитата(Proger10 @  22.3.2009,  23:48 Найти цитируемый пост)
То ли это я сокеты закрываю вот этими строками в конце:
os.close();
is.close();

Учись читать ДжаваДоки:
Цитата

Closing the returned {@link java.io.InputStream InputStream} will close the associated socket.
Closing the returned {@link java.io.OutputStream OutputStream} will close the associated socket.





Цитата(Proger10 @  22.3.2009,  23:48 Найти цитируемый пост)
А почему? Flush есть.. по идее должен ведь уходить клиенту.. В чём моя ошибка?

Попробуй на файле флаш сделать.


--------------------
Lost....
PM MAIL MSN   Вверх
Proger10
Дата 23.3.2009, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



А с os.close(); что делать?
Если её закомментить (чтобы связь не рвать, мне работать ещё далее в обе стороны нужно..), тогда завершение приёма у клиента никогда не наступает. 
Если оставить - то файл приходит отлично! Но с сервера бьётся коннект до сервера. Причём в обратную сторону связь успешно держится! smile С клиента на сервер данные идут. 

Но далее у меня срабатывает реконнект (это моя фича smile ), которая через несколько секунд понимает, что коннекта нет и коннектится заново к серверу - и тогда снова всё отлично работает в обе стороны.

А вот нельзя ли как и с севером что-то сделать? Закомментил os.close() и поставил с радости os.shutdownOutput() но не сработало  smile Связь рвётся по направлению от сервера к клиенту..

Добавлено @ 01:25
Kangaroo
Не понял про файл.. fis.flush()?

походу он не поймёт о чём это мы: smile
Код
...: cannot find symbol
symbol  : method flush()
location: class java.io.FileInputStream
                        fis.flush();


Похоже нужно как-то EOF послать с сервера клиенту... Потому как клиент зависает на получении файла, но как только закрываешь прогу-сервер - так сразу он и получает файл smile (соответственно на клиенте делать наверное нечего, пока нормальный EOF без разрыва связи с сервера не послать, на клиенте ведь "бесконечный" принимающий цикл)
Поэтому os.close() на сервере и срабатывает, но как объяснил уже Kangaroo, закрывается не только поток, но и ассоциированный с ним сокет.

Это сообщение отредактировал(а) Proger10 - 23.3.2009, 01:29
PM MAIL   Вверх
Proger10
Дата 23.3.2009, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Как бы мне так послать с сервера EOF, чтобы сокет не закрывать у себя? smile

Кстати, а socket.shutdownInput() также закрывает сокет с предварительным EOF? Что-то у меня он не посылает EOF клиенту..

Это сообщение отредактировал(а) Proger10 - 23.3.2009, 01:37
PM MAIL   Вверх
Proger10
Дата 23.3.2009, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Походу тема зашла в тупик smile Западные коллеги подсказали, что это сделать невозможно smile
Говорят, чтобы либо отдельный сокет открывал на передачу файла, либо предварительно просто размер файла слал и ждал это кол-во байтов. Так и сделаю!
PM MAIL   Вверх
Kangaroo
Дата 23.3.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 2
Всего: 104



Цитата(Proger10 @  23.3.2009,  01:16 Найти цитируемый пост)
Не понял про файл.. fis.flush()?

Ну, я про аут говорил smile Может байты приходят, а просто в файл не записываются.




--------------------
Lost....
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0964 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.