powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача файла через SocketChannel
8 сообщений из 8, страница 1 из 1
Передача файла через SocketChannel
    #33706494
Lennier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверняка кто-нибудь сталкивался с такой задачей: нужно передать файл через сокетное соединение (nio). Перерыл кучу документации, но желаемого результата не достиг: файл передается, но не всегда и не всегда целиком. Такое ощущение, что клиент, получающий данные от сервера, получает их быстрее, чем они приходят, и в определенный момент клиент думает, что данные закончились, а на самом деле просто очередная порция еще не пришла. Может быть дело и не в этом, я просто теряюсь в догадках.

Вот кусок сервера:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
FileChannel fc;
 int  BUFFER_SIZE =  1024 ;
SocketChannel sc;

..... 

   long  bytesSent = fc.transferTo( 0 , BUFFER_SIZE, sc);
   System.out.println("."+bytesSent+" bytes sent");
   fc.position(bytesSent);
   Thread.sleep( 1 );
    while  (bytesSent >  0 ) {
    bytesSent = fc.transferTo(fc.position(), BUFFER_SIZE, sc); 
   System.out.println("."+bytesSent+" bytes sent");
    fc.position(fc.position()+bytesSent); 
   Thread.sleep( 1 );
   }


Вот кусок клиента:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
   FileOutputStream fos =  new  FileOutputStream(fileName);
   FileChannel fc = fos.getChannel();
    long  receivedBytes = fc.transferFrom(channel,  0 , BUFFER_SIZE);
   fc.position(receivedBytes);
    while  (receivedBytes >  0 ) { 
   receivedBytes = fc.transferFrom(channel, fc.position(), BUFFER_SIZE);
   fc.position(fc.position()+receivedBytes);
     try  {
     Thread.sleep( 100 );
    }     catch  (InterruptedException e) { 
    e.printStackTrace();
    }
   } 


Буду признателен за любую помощь.
...
Рейтинг: 0 / 0
Передача файла через SocketChannel
    #33707210
Dima Yermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
while (receivedBytes > 0) поменяй на while (receivedBytes != -1)
может поможет


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Передача файла через SocketChannel
    #33707336
Lennier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не поможет, transferTo() возвращает неотрицательные значения.
...
Рейтинг: 0 / 0
Передача файла через SocketChannel
    #33707448
Dima Yermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Returns:
The number of bytes, possibly zero, that were actually transferred

http://java.sun.com/j2se/1.4.2/docs/api/java/nio/channels/FileChannel.html#transferFrom(java.nio.channels.ReadableByteChannel,%20long,%20long)

только я не понял как узнать что все байты переданны.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Передача файла через SocketChannel
    #33707477
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
Похоже, что дело в буферизации. Естественно, я могу ошибаться.
Попробуйте

Код: plaintext
1.
2.
    bytesSent = fc.transferTo(fc.position(), BUFFER_SIZE, sc); 
    sc.socket().getOutputStream().flush();

и на клиенте
Код: plaintext
1.
2.
receivedBytes = fc.transferFrom(channel, fc.position(), BUFFER_SIZE);
fos.flush();
...
Рейтинг: 0 / 0
Передача файла через SocketChannel
    #33707500
Alex Catt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fooПохоже, что дело в буферизации. Естественно, я могу ошибаться.
Попробуйте

Код: plaintext
1.
2.
    bytesSent = fc.transferTo(fc.position(), BUFFER_SIZE, sc); 
    sc.socket().getOutputStream().flush();

и на клиенте
Код: plaintext
1.
2.
receivedBytes = fc.transferFrom(channel, fc.position(), BUFFER_SIZE);
fos.flush();


+1

сам помню парился по поводу флаша. а в доках не было ничего.
метод тыка помог
...
Рейтинг: 0 / 0
Передача файла через SocketChannel
    #33707589
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flash() конечно же нужен, но и с ним могут быть такие же проблемы и даже будут. Т.к. клиент все равно не в курсе, все данные он получил или нет. Нужно после передачи файла, отправить какую-нибудь заранее оговоренную последовательность символов и после ее приема, клиент уже точно узнает, что он получил все данные.
...
Рейтинг: 0 / 0
Передача файла через SocketChannel
    #33707820
Edgiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эта оговоренная последовательность символов случайно может присутствовать в самом файле.

лучше заранее передать размер файла
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача файла через SocketChannel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]