Форум: "Сети";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
ВнизФайл через сокет Найти похожие ветки
← →
paradox01 (2007-02-27 12:08) [0]Как можно передать файлы через Socket.
← →
Сергей М. © (2007-02-27 12:21) [1]Обычным образом - прочитать содержимое файла (хоть целиком, хоть в цикле "кусками") в временный буфер и передать содержимое буфера.
← →
paradox01 (2007-02-27 13:52) [2]
> Обычным образом - прочитать содержимое файла (хоть целиком,
> хоть в цикле "кусками") в временный буфер и передать содержимое
> буфера.
<Можешь скинуть мне на мыло текст блока которое реализует это? А то я новичок в этом деле. Буду благодарен…/I>
← →
hero © (2007-02-27 14:07) [3]для меня удобней так:
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-28 08:48) [4]Скиньте плиз исходник программы или процедуру, которая отправляет файл и процедуру, которая принимает файл.
← →
Сергей М. © (2007-02-28 10:39) [5]
> paradox01 (28.02.07 08:48) [4]
Чем [3] не устраивает ?
← →
DiamondShark © (2007-02-28 12:37) [6]
> Чем [3] не устраивает ?
чем, чем...
не компилится если скопипастить.
← →
Сергей М. © (2007-02-28 13:38) [7]
> DiamondShark © (28.02.07 12:37) [6]
Да уж ... беда ...)
← →
Rouse_ © (2007-02-28 14:50) [8]
> не компилится если скопипастить.
Китайский метод программирования еще ни к чему хорошему не приводил.
Сообщения о ошибках читаешь? Они же не просто-так тебе пишутся...
← →
hero © (2007-03-02 12:18) [9]написанное мной не весь исходник, в таком виде он только в целях изучения (можно сказать все разжевано) а если ты элементарной азбуки не знаеш то тебе браток рано еще за енто хвататься иди штудируй теорию
← →
Сергей М. © (2007-03-02 15:33) [10]
> hero © (02.03.07 12:18) [9]
А ты хам, братец кролик)
Во-первых, [8] было заброшено не в твой огород.
Во-вторых, не надо уже про "элементарную азбуку" - про нее и тебе вовсе не грех вспомнить.
← →
G_M_S (2007-03-02 18:24) [11]Передавать можно не кусками, передавать можно сразу весь файл. Контроль "дохождения" будет и без тебя выполнен на более низком уровне. При работе с TTcpServer надо создавать отдельный поток для каждого подключения - дело в шляпе: передаешь что-то типа "имя_файла@размер@", а на принимающей стороне проверяешь в OnRead: если размер и имя файла не проинициализированы - разбираешь буфер на предмет этой строчки, если инициализированы - пишешь в открытый при инициализации стрим. В OnDisconnect закрываешь стрим - и все дела.
← →
Hero © (2007-03-03 06:45) [12]> G_M_S (02.03.07 18:24) [11]
Передавать можно не кусками
согласен
но почему-то при передачи больших файлов (свыше 20 мег. ) через юдп зависает
>Сергей М. © (02.03.07 15:33) [10]
А ты хам, братец кролик)
а я братец и не тебе писал.
а тому кто в моем разжеванном примере разобраться не смог
а на счет азбуки.. смотря что считать азбукой ...
а то мож и тебе бы не проч почитать...
а вообще я не хочу ни скем ссориться, если кого обидел простите.
← →
Belorus © (2007-03-03 08:59) [13]Называется "поговнились, и хватит".
← →
G_M_S (2007-03-03 09:39) [14]
> но почему-то при передачи больших файлов (свыше 20 мег.
> ) через юдп зависает
тут вообще, насколько я понял речь про TCP/IP шла (ну и про компоненты с ним работающие, ессно). Через UDP я филе не кидал, потому с такими глюками и не сталкивался. А так - есть софтина для корпоративного обновления антивируса (централизовано сливает апдейт для халявного антивиря) - с инета апдейт тащит через TClientSocket, проблем с файлами (основная антивирусная база - 7 Мб) небыло. Да и по локалке архивы раскидываются без проблем, причем достаточно крупные.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.061 c