Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2012, 11:40   #1
olddruid
Новичок
Джуниор
 
Регистрация: 28.03.2012
Сообщений: 1
По умолчанию пересылка файла tSocket

Доброго времени суток, помогите разобраться,
когда все это запускаешь в пределах одного компьютера - все работает
когда разносишь на разные теряется (я так понимаю) первые несколько килобайт
что наводит на меня тоску. И почему так медленно файл принимается по сети????
Просьба ко всем сочуствующим:
Инди не предлагать.
Заранее благодарю


//Сервер отсылает файл
procedure TForm1.ServerSocket1ClientRead(Send er: TObject; Socket: TCustomWinSocket);
var s,s1,host,address,port:string;
Dir,myfilename:string;
fs:TFileStream;
begin
fs:=TFileStream.Create(myfilename,f mOpenRead); // файл уже существует и его путь в myfilename
fs.Position:=0; //позицию на начало
Socket.SendText('SCRS:'+ IntToStr(fs.Size)+ #0+'Name:'+extractfilename(myfilena me)+#0);
//SCRS: - маркер принимающей стороне что придет файл
//сразу после этого высылаю размер файла и #0 как маркер окончания размера файла
//на той стороне strtoint сделаю
//потом идет имя файла и #0 - на той стороне таким же макаром раздербаню строку и получу имя файла
Socket.SendStream(fs); // шлю файл
end;

//клиент должен получить файл его имя и размер
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var s,s1:string;
fname:string;
iLen,size: Integer;
Bfr: Pointer;
begin
if Reciving=False then // Reciving -- boolean прописан в private = он же маркер приема файла если True
begin // итак если не принимаем файл, то
s:=Socket.ReceiveText; // все что пришло в сокет пишем в строку и анализируем
iLen := Socket.ReceiveLength; // длину данных из сокета в iLen
Socket.ReceiveBuf(Bfr^, iLen); // на всякий пожарный это же в буфер
Memo1.Lines.Add('>'+s); // выводим строку которая приплыла из сокета
if copy(s,1,5)='SCRS:' then // анализируем что прислал сокет и если там SCRS: то
begin
s1:=copy(s,6, Pos(#0, s)-5); // cохраняем в S1 то что идет после SCRS: до первого #0
DataSize:=StrToInt(s1); // по задумке это размер входящего файла - пишем его в DataSize
delete(s,1,Pos(#0,s)); // удаляем в S все до этого места
// получаем имя файла
if copy(s,1,5)='Name:' then // таперича если у нас там Name:
begin
fname:=copy(s,6, Pos(#0, s)-5); //получим имя файла таким же способом
delete(s,1,Pos(#0,s));
end;
fs:=TFileStream.Create(fname,fmCrea te); //создаем поток
Memo1.Lines.Add('Внимание, входящий файл: ' +PChar(fname)+ ' размером: '+ IntToStr(Datasize));
Reciving:=True; //включаем режим приема
// FS.Write(Bfr^, iLen); //ни на что не влияет
// FreeMem(Bfr); // к сожалению
end;
end;
if Reciving then // если режим приема включен то
Begin
iLen := Socket.ReceiveLength; //получаем длинну
GetMem(Bfr, iLen); // выделяем память
try
Socket.ReceiveBuf(Bfr^, iLen); // и пишем в буфер то что с сокета нам идет
FS.Write(Bfr^, iLen); // а потом в файл наш буфер
finally
FreeMem(Bfr); // очищаем буфер
end;
ProgressBar1.Max:= DataSize; // во и прогресс бар прикрутили
ProgressBar1.Position :=fs.Size;
If fs.Size>=DataSize then //сверяем размер того что записали с размером входящего файла
begin
FS.Free; //и раз уж размер совпал закрываем все
FS:= nil; //
Reciving:=False; // выключаем прием
Memo1.Lines.Add('Файл успешно принят'); //рапортуем
ProgressBar1.Position :=0; // прячем прогрессбар
end;
End;
end;
olddruid вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потеря части данных при отправке через TSocket Crystallon Работа с сетью в Delphi 7 02.10.2011 21:46
Пересылка в Assembler aly-lucenko Помощь студентам 10 23.05.2011 20:33
TSocket Federal Помощь студентам 1 28.05.2010 15:04
Пересылка данных Lyubov1990 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 26.04.2010 12:59
Пересылка ДАнных на e-mail boba HTML и CSS 1 07.11.2008 00:04