Форум: "Сети";
Текущий архив: 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.011 c