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

Вниз

Сокеты. Посылка файла посредстом 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
1-71602
Sharik_212
2003-09-09 15:27
2003.09.22
Хинт или альтернатива.


14-71951
lobster
2003-09-04 00:53
2003.09.22
заголовки функций из dll


7-71979
Игорь_1984
2003-07-09 11:41
2003.09.22
Как убить процесс, зная его имя?


6-71804
АСМиД
2003-07-09 14:37
2003.09.22
Почему ServerSocket не держит более примерно 10 клиентов


3-71543
analyser
2003-08-28 10:25
2003.09.22
ADOConnection и UDL - ошибка открытия, если сначала прочитать...