Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.04;
Скачать: CL | DM;

Вниз

Файл через сокет   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
9-1161945837
Lamer_2006
2006-10-27 14:43
2007.11.04
Шо не так?


3-1182845730
Yasmin
2007-06-26 12:15
2007.11.04
Не обновляются данные


2-1192005087
kyn66
2007-10-10 12:31
2007.11.04
Полуошибка ???


15-1191237113
Суслик
2007-10-01 15:11
2007.11.04
Покритикуйте описание системных требований моего продукта


15-1190501517
Comunicator
2007-09-23 02:51
2007.11.04
BC3.1