Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Вниз

Сокеты. Посылка файла посредстом TcpClient и TcpServer   Найти похожие ветки 

 
Jao   (2003-06-30 16:36) [0]

Здраствуйте, я посылаю файл через TFileSream используя SendStream
может, кто знает, как это дело потом правильно принять и записать в файл *функции принятия Sream-а я не нашел*, но не по байтам же принимать его в конце концов?

----
причем файл не является текстовым


 
jel   (2003-06-30 16:43) [1]

procedure ReadStream(AStream: TStream; AByteCount: LongInt; const AReadUntilDisconnect: boolean);


 
Jao   (2003-06-30 16:49) [2]

нет там такого - есь токо ReceiveBuf и ReceiveLn :(


 
jel   (2003-06-30 16:53) [3]

В D7 - не знаю. Кусок справки из D6.


 
Digitman   (2003-06-30 17:08) [4]


> не по байтам же принимать его в конце концов


почему бы и нет ?


 
Polevi   (2003-07-01 16:26) [5]

2Digitman © (30.06.03 17:08)
осторожнее, может понять буквально :))


 
Jao   (2003-07-01 17:23) [6]

балин пришлось перейди на Indy, там оно есь


 
Digitman   (2003-07-02 08:13) [7]


> Jao


давай-давай)...
а завтра в Инди какой-нибудь еще метод не найдется - что будешь делать ? если не разобравшись с простым и наглядным компонентом ты бездумно "полез" в сверхнавороченые "дебри" другого компонента ?


 
Jao   (2003-07-02 11:40) [8]


>Digitman

время ведь не ждет...как мне в тады в TcpServer считать из сокета зашифрованный файл, ведь даже тот же SendStream убивает цифровую подпись? *может как нить через SendBuf и ReceiveBuf, но я не знаю как и найти нигде не могу*


 
Digitman   (2003-07-02 12:38) [9]


> SendStream убивает цифровую подпись


чего-чего ?) какую такую еще "подпись" ????

задача любого метода SendStream() - отправить блок данных, находящихся в памяти процесса. Ни о каких файлах и всяких там "цифровых подписях" он знать ничего не знает : что на момент отправки есть в потоке, то и отправляет. А что и каким образом оказалось в этот момент в потоке - это знаешь только ты и это твои проблемы. Файл в память потока считываешь ты сам.

SendBuf() ничем радикально не отличается от SendStream() - просто вместо параметра Stream требует адрес и размер блока памяти, требуемого к отправке.



 
Jao   (2003-07-02 13:46) [10]

> чего-чего ?)
Калечатся некоторые байты - текстовые файлы без проблем


 
Digitman   (2003-07-02 13:54) [11]


> Jao


глупости)

ну нет дла SensStream() понятия "файл" !! Будь он хоть текстовый хоть не текстовый)... SensStream() передает ПОТОК !! ... в том виде в каком он есть на момент передачи) ...
а что ты поместил в поток перед его передачей - это твои проблемы)


 
Nick2000   (2003-07-18 17:45) [12]


var
Size: integer;
P: ^Byte;
begin
FS := TMemoryStream.Create;
FS.LoadFromFile(Edit1.Text);
Label1.Caption:=IntToStr(FS.Size);
ServerSocket1.Socket.Connections[0].SendText(Edit1.Text+"@"+IntToStr(FS.Size)+"@");
FS.Position := 0;
P := FS.Memory;
Size := ServerSocket1.Socket.Connections[0].SendBuf(P^, FS.Size); ( Size)

var
Size: integer;
P: ^Byte;
begin
FS := TMemoryStream.Create;
FS.LoadFromFile(Edit1.Text);
Label1.Caption:=IntToStr(FS.Size);
ServerSocket1.Socket.Connections[0].SendText(Edit1.Text+"@"+IntToStr(FS.Size)+"@");
FS.Position := 0;
P := FS.Memory;
Size := ServerSocket1.Socket.Connections[0].SendBuf(P^, FS.Size);
ProgressBar1.Position := Size*100 div FS.Size;
StatusBar1.SimpleText := Send "+IntToStr(Size)+" from "+IntToStr(FS.Size);


Посылка через ServerSocket. Ничего не бъется. Проверено.

Вот тебе пересылка


 
Digitman   (2003-07-21 15:33) [13]


> Nick2000


> Ничего не бъется. Проверено


в условиях глоб.сети и неблок.режима гнезда-передатчика это как положено работать не будет.


 
Stas   (2003-07-21 16:10) [14]

>>>Nick2000 (18.07.03 17:45)

А как получить ?
Можно пример.


 
Nick2000   (2003-07-22 10:28) [15]

> Digitman
Возможно и так, но я думаю тут не ставяться глобальные цели, а ради демонстрации - вполне пригодно.

>Stas
Держи.

procedure TForm1.Writing(Text: string);
begin
if FS.Size < Size then
FS.Write(Text[1], Length(Text));
ProgressBar1.Position := FS.Size*100 div Size;
StatusBar1.SimpleText := "Received "+IntToStr(FS.Size)+" from "+IntToStr(Size);
if FS.Size = Size then
begin
Receive := false;
FS.Position := 0;
FS.SaveToFile(Name);
ClientSocket1.Socket.SendText("end");
FS.Free;
StatusBar1.SimpleText := "Received successfull";
end;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Rtext: string;
begin
Rtext := Socket.ReceiveText;
if Receive then
Writing(RText)
else
begin
if Copy(Rtext, 0, Pos("#", Rtext) -1) = "file" then
begin
FS := TMemoryStream.Create;
Delete(Rtext, 1, Pos("#", Rtext));
Name := Copy(Rtext, 0, Pos("#", Rtext) -1);
Name:=ExtractFileName(Name);
Delete(Rtext, 1, Pos("#", Rtext));
Size := StrToInt(Copy(Rtext, 0, Pos("#", Rtext) -1));
Delete(Rtext, 1, Pos("#", Rtext));
Label1.Caption := Filesize: "+IntToStr(Size)+" b";
Label2.Caption := "File name: "+Name;
Receive := true;
Writing(RText);
( 21.07.03 15:33) > Digitman
Возможно и так, но я думаю тут не ставяться глобальные цели, а ради демонстрации - вполне пригодно.

>Stas
Держи.

procedure TForm1.Writing(Text: string);
begin
if FS.Size < Size then
FS.Write(Text[1], Length(Text));
ProgressBar1.Position := FS.Size*100 div Size;
StatusBar1.SimpleText := "Received "+IntToStr(FS.Size)+" from "+IntToStr(Size);
if FS.Size = Size then
begin
Receive := false;
FS.Position := 0;
FS.SaveToFile(Name);
ClientSocket1.Socket.SendText("end");
FS.Free;
StatusBar1.SimpleText := "Received successfull";
end;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Rtext: string;
begin
Rtext := Socket.ReceiveText;
if Receive then
Writing(RText)
else
begin
if Copy(Rtext, 0, Pos("#", Rtext) -1) = "file" then
begin
FS := TMemoryStream.Create;
Delete(Rtext, 1, Pos("#", Rtext));
Name := Copy(Rtext, 0, Pos("#", Rtext) -1);
Name:=ExtractFileName(Name);
Delete(Rtext, 1, Pos("#", Rtext));
Size := StrToInt(Copy(Rtext, 0, Pos("#", Rtext) -1));
Delete(Rtext, 1, Pos("#", Rtext));
Label1.Caption := Filesize: "+IntToStr(Size)+" b";
Label2.Caption := "File name: "+Name;
Receive := true;
Writing(RText);
end;
end;

end;


> Digitman © (21.07.03 15:33)



 
Digitman   (2003-07-22 10:38) [16]


> Nick2000 (22.07.03 10:28)


не знаю уж какие ставятся, но рано или поздно это "выстрелит" ... даже и в условиях простейшей малонагруженной ЛВС это может приключиться


 
Nick2000   (2003-07-22 10:49) [17]


> Digitman © (22.07.03 10:38)

Согласен с тобой. Но дальше сам разберется.
Там видно будет, хотя можно и сразу попробовать.




 
Digitman   (2003-07-22 11:01) [18]


> Nick2000


вот я и намекаю (на базе твоего примера) автору, что все send-методы - функции, возвращающие опред.результат, игнорировать который для неблок.режима передатчика в общем случае нельзя.
и с этим тесно связано событие On[Client]Write().
т.е. хэлп + раздел MSDN по winsock в этой части дадут суммарно гораздо более надежный и устойчивый результирующий алгоритм, хоть и заметно сложней он будет по отношению к приведенному примеру


 
Stas   (2003-07-22 11:21) [19]

>>Nick2000 (22.07.03 10:28)

Спасибо !!!



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.01 c
4-72008
oduvan
2003-07-20 20:07
2003.09.22
Как получить список хендлов всех программ не в трее а в таскбаре?


1-71595
Dred2k
2003-09-10 21:21
2003.09.22
Ошибка при ClientDataSet.Open - Член группы не найден


14-71863
Е-Моё имя
2003-09-01 11:53
2003.09.22
по оформлению


3-71487
Vadim
2003-08-31 23:01
2003.09.22
Проблема с сохранением БД


3-71560
Domkrat
2003-08-28 22:41
2003.09.22
Вопрос по IBX - default значения полей в базе данных Firebird





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский