Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
8-1168494147
roughneck
2007-01-11 08:42
2007.11.04
Быстрый способ чтения Jpeg


2-1192188905
(MiTch)
2007-10-12 15:35
2007.11.04
Как заблокировать часть таблицы в компоненте stringGrid ?


2-1192082670
Jimmy
2007-10-11 10:04
2007.11.04
Размер оперативной памяти


11-1175198781
ElectriC
2007-03-30 00:06
2007.11.04
a-la KeyPreview


2-1192367636
WooW
2007-10-14 17:13
2007.11.04
RemoveDir





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский