Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];

Вниз

передать файлы через сеть   Найти похожие ветки 

 
проходивший мимо   (2007-03-29 21:35) [0]

интересует с помощью чего и как лучше передавать большие файлы через сеть?

пробовал ServerSocket&ClientSocket, но при передачи фильма или музыки конечный файл оказывался совершенно не читаемым.
делал так:
на сервере:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
 ms: TMemoryStream;
begin
 if Socket.ReceiveText = "send" then//если пришла команда на отправку, то
 begin
   ms:= TMemoryStream.Create;
   try
     ms.LoadFromFile(in_file);//загружаем файл в память
     ms.Position:= 0;
     Socket.SendText(IntToStr(ms.Size) + #0); //пеердаём размер файла и отделяем его символом #0
     Socket.SendStream(ms); //отправляем
   except
     
     ms.Free; //очищаем
   end;
 end;
end;


на клиенте:

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
 s, sl,ss: string;
begin
 s:= Socket.ReceiveText;
//если не в режиме приёма
 if not Reciving then
 begin
   SetLength(sl, StrLen(PChar(s))+1); //получаем длину файла
   StrLCopy(@sl[1], PChar(s), Length(sl)-1);
   DataSize:= StrToInt(sl);
   Data:= TMemoryStream.Create;
   Delete(s, 1, Length(sl));//удаляем размер файла
   Reciving:= true;

//это чтоб знать сколько данный поступило
(*    ss:=IntToStr(Data.Position)+" / "+IntToStr(DataSize)+" .";
   Label3.Caption:=ss;
   Gauge1.MaxValue:=DataSize;*)
 end;
 Application.ProcessMessages;
//сохраняем данные в файл, пока не получим всё
 try
//это чтоб знать сколько данный поступило
(*  ss:=IntToStr(Data.Position)+" / "+IntToStr(DataSize)+" .";  
   Label3.Caption:=ss;
   Gauge1.Progress:=Data.Position;*)

   Data.Write(s[1], length(s));
   if Data.Size = DataSize then
   begin
     Data.Position:= 0;
     Data.SaveToFile(out_file);//сохраняем в указанный файл
     Data.Free;
     Reciving:= false;
     Socket.Close;
   end;
 except
   Data.Free;
 end;
end;


может что-то не так делаю... или может лучше передавать с помощью чего-то другого?


 
Сергей М. ©   (2007-03-30 08:19) [1]

Delete(s, 1, Length(sl) + 1);//удаляем размер файла


 
проходивший мимо   (2007-03-30 11:14) [2]

не получется.

тогда вот это условие никогда верным не бывает (я кучу раз проверил, никогда переданный файл не сохранялся.)

if Data.Size = DataSize then
  begin
    ...
  end.


 
Сергей М. ©   (2007-03-30 12:35) [3]

сервер:

var
fs: TFileStream;
fsize: Int64;
..
  fs:= TFileStream.Create(in_file, fmRead);
  try
    fsize := fs.Size;
    Socket.SendBuf(fsize, SizeOf(fsize));
    Socket.SendStream(fs);
  except
   
    fs.Free;
    raise;
  end;

клиент:

type
 TRcvState = (rsRcvFileSize, rsRcvFileData);

var
 BytesNeed: Int64 = SizeOf(TInt64);
 RcvState: TRcvState = rsRcvFileSize;
 buf: array[0..4095] of Byte;
 fs: TFileStream;
..

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
 BytesRead: Integer;
begin
case RcvState of
  rsRcvFileSize:
    begin
       BytesRead := Socket.ReceiveBuf(buf[BytesNeed - SizeOf(Int64)], BytesNeed);
       if BytesRead = 0 then Exit;
       Dec(BytesNeed, BytesRead);
       if BytesNeed > 0 then Exit;
       BytesNeed := PInt64(@buf)^;
       RcvState := rsRcvFileData;
    end;
  rsRcvFileData:
    begin
      BytesRead := Socket.ReceiveBuf(buf, Min(BytesNeed, SizeOf(Buf));
       if BytesRead = 0 then Exit;
       Dec(BytesNeed, BytesRead);      
      if not Assigned(fs) then
        fs:= TFileStream.Create(out_file, fmCreate);
      try
        fs.WriteBuffer(buf, BytesRead);
      except    
         FreeAndNil(fs);
         raise;
      end;
      if BytesNeed > 0 then Exit;
      FreeAndNil(fs);
      BytesNeed := SizeOf(Int64);
      RcvState := rsRcvFileSize;
    end;
end;
end;


 
Ketmar ©   (2007-03-30 13:21) [4]

c помощью 3" floppy.


 
проходивший мимо   (2007-03-31 15:02) [5]

Сергей М., спасибо большое.
вроде работает, щас проверять на передачу фильмлв буду


 
проходивший мимо   (2007-03-31 16:14) [6]

абалдеть. ещё раз спасибо. скорость раз в 50 увеличилась!



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.044 c
15-1193864290
Kick
2007-10-31 23:58
2007.12.02
Словарь трминов программирования


15-1193540042
Асм
2007-10-28 05:54
2007.12.02
ассемблер


15-1194117044
vasIZmax
2007-11-03 22:10
2007.12.02
Диплом не за горами (посоветуйте и только)


2-1192410570
Номер
2007-10-15 05:09
2007.12.02
Скажите, как загрузить курсор из потока?


15-1194006857
de.
2007-11-02 15:34
2007.12.02
Определить IP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский