|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
30.03.2012, 11:40 | #1 |
Новичок
Джуниор
Регистрация: 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; |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Потеря части данных при отправке через 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 |