![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Файл через сокет
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]Обычным образом - прочитать содержимое файла (хоть целиком, хоть в цикле "кусками") в временный буфер и передать содержимое буфера.