Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Файл через сокет


paradox01 ©   (2007-02-27 12:08:00) 

Как можно передать файлы через Socket.


G_M_S   (2007-03-03 09:39:00) [1]


> но почему-то при передачи больших файлов (свыше 20 мег.
> ) через юдп зависает


тут вообще, насколько я понял речь про TCP/IP шла (ну и про компоненты с ним работающие, ессно). Через UDP я филе не кидал, потому с такими глюками и не сталкивался. А так - есть софтина для корпоративного обновления антивируса (централизовано сливает апдейт для халявного антивиря) - с инета апдейт тащит через TClientSocket, проблем с файлами (основная антивирусная база - 7 Мб) небыло. Да и по локалке архивы раскидываются без проблем, причем достаточно крупные.


Belorus   (2007-03-03 08:59:00) [2]

Называется "поговнились, и хватит".


Hero   (2007-03-03 06:45:00) [3]

> G_M_S   (02.03.07 18:24) [11]
Передавать можно не кусками


согласен
но почему-то при передачи больших файлов (свыше 20 мег. ) через юдп зависает

> Сергей М. ©   (02.03.07 15:33) [10]
А ты хам, братец кролик)


а я братец и не тебе писал.
а тому кто в моем разжеванном примере разобраться не смог

а на счет азбуки.. смотря что считать азбукой ...
а то мож и тебе бы не проч почитать...

а вообще я не хочу ни скем ссориться, если кого обидел простите.


G_M_S   (2007-03-02 18:24:00) [4]

Передавать можно не кусками, передавать можно сразу весь файл. Контроль "дохождения" будет и без тебя выполнен на более низком уровне. При работе с TTcpServer надо создавать отдельный поток для каждого подключения - дело в шляпе: передаешь что-то типа "имя_файла@размер@", а на принимающей стороне проверяешь в OnRead: если размер и имя файла не проинициализированы - разбираешь буфер на предмет этой строчки, если инициализированы - пишешь в открытый при инициализации стрим. В OnDisconnect закрываешь стрим - и все дела.


Сергей М.   (2007-03-02 15:33:00) [5]


> hero ©   (02.03.07 12:18) [9]


А ты хам, братец кролик)

Во-первых, [8] было заброшено не в твой огород.
Во-вторых, не надо уже про "элементарную азбуку" - про нее и тебе вовсе не грех вспомнить.


hero   (2007-03-02 12:18:00) [6]

написанное мной не весь исходник, в таком виде он только в целях изучения (можно сказать все разжевано) а если ты элементарной азбуки не знаеш то тебе браток рано еще за енто хвататься иди штудируй теорию


Rouse_   (2007-02-28 14:50:00) [7]


> не компилится если скопипастить.

Китайский метод программирования еще ни к чему хорошему не приводил.
Сообщения о ошибках читаешь? Они же не просто-так тебе пишутся...


Сергей М.   (2007-02-28 13:38:00) [8]


> DiamondShark ©   (28.02.07 12:37) [6]


Да уж ... беда ...)


DiamondShark   (2007-02-28 12:37:00) [9]


> Чем [3] не устраивает ?

чем, чем...
не компилится если скопипастить.


Сергей М.   (2007-02-28 10:39:00) [10]


> paradox01   (28.02.07 08:48) [4]


Чем [3] не устраивает ?


paradox01   (2007-02-28 08:48:00) [11]

Скиньте плиз исходник программы или процедуру, которая отправляет файл и процедуру, которая принимает файл.


hero   (2007-02-27 14:07:00) [12]

для меня удобней так:

var
 Form1: TForm1;
 Stream :Tfilestream;  
 size:integer;  
implementation
файл стрим и на серваке и на клиенте

создаешь стрим  когда Opendialog1.execute в клиенте
stream := tfilestream.create(имя файла, fmOpenRead) ...помойму так.....

передаем по сокету имя файла и Stream.size и ждем письма от сервака

когда сервак получил команду о файле и о данных(имя, размер)
создаем файлстрем так
Stream :=TFileStream.create(путь\имя файла, fmcreate);
запоминаем размер в переменной size
и сообщаем клиенту что готовы принять порцию

после того как клиент получил от сервака на назрешение передачи
передаем
var buf:array[1..2048] of char; или of byte безразницы ... хотяя ... разница е. но я пишу of char
   r:integer
begin
r:= stream.Read(buf,2048);
if r > 0 then
Socket.sendbuffer(buf,r)
else sream.free;

на серваке
получаем
var r:integer;
buf:array[1..2048] of char;
begin
r:=Socket.ReceiveBuf(buf,2048);
if (r > 0) or (stream.size < size) then
begin
 stream.write(buf,r);
 говорим что опять готовы принять порцию
end
else stream.frem //файл принят

вобчем переменная size не обязательно и or (stream.size < size) тоже
но если вы хотите прогрессбар тады обязательно где max = size a pos =stream.size
ну вобчем суть должна быть понятна


paradox01   (2007-02-27 13:52:00) [13]


> Обычным образом - прочитать содержимое файла (хоть целиком,
>  хоть в цикле "кусками") в временный буфер и передать содержимое
> буфера.
<Можешь скинуть мне на мыло текст блока которое реализует это? А то я новичок в этом деле. Буду благодарен…/I>


Сергей М.   (2007-02-27 12:21:00) [14]

Обычным образом - прочитать содержимое файла (хоть целиком, хоть в цикле "кусками") в временный буфер и передать содержимое буфера.


Наверх

Титульная страница Поиск, карта сайта Написать письмо