Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Jao ©   (2003-06-30 16:36:00) 

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

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


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

>>Nick2000 (22.07.03 10:28)

Спасибо !!!


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


> Nick2000


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


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


> Digitman © (22.07.03 10:38)

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



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


> Nick2000 (22.07.03 10:28)


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


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

> 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)


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

>>>Nick2000 (18.07.03 17:45)

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


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


> Nick2000


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


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


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


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-02 13:54:00) [9]


> Jao


глупости)

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


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

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


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


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


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

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

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


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


>Digitman

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


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


> Jao


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


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

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


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

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


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


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


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


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

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


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо