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

Вниз

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

 
проходивший мимо   (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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
2-1194360069
ArrotVazyPror
2007-11-06 17:41
2007.12.02
где скачать музыку


10-1139575478
Shopot
2006-02-10 15:44
2007.12.02
Как в Excel задать ширину столбца?


15-1193766687
@!!ex
2007-10-30 20:51
2007.12.02
где почитать про дебагинг под Delphi


2-1194595298
lobach
2007-11-09 11:01
2007.12.02
Обработка ошибки


15-1193864290
Kick
2007-10-31 23:58
2007.12.02
Словарь трминов программирования