Avatar billede tillon Nybegynder
16. november 2003 - 17:53 Der er 4 kommentarer

fil overførsel ved brug af client og serversocket

Jeg har snart brug mange timer på dette problem.
Jeg har to programmer serveren og clienten. Jeg prøver et implamentere en funktion der kan sende filer fra serveren til clienten. Problemmet er at jeg kan godt sende små filer men når de bliver stører melder problemmerne sig. Clienten modtager og gemmer ikke de rigtige data :(.

Server:
{sender med denne simple commando, strcom er stien til den pågældende fil.}
userSocket.SendStream(TFilestream.Create( strcom, fmOpenRead or fmSharedenywrite));

Client:
procedure filetranspro(socket:TCustomWinSocket);
Var
  F : TFileStream;
  iLen, counter: Integer;
  Bfr: Pointer;
begin
  F := TFileStream.Create(form1.Edsavepath.text, fmCreate);
  iLen := Socket.ReceiveLength;
  GetMem(Bfr, iLen);
  try
    while true do
    begin
      counter:=Socket.ReceiveBuf(Bfr^, iLen);
      if counter<=0 then
        break
      else
      F.WriteBuffer(Bfr^, counter);
    end;
  finally
    FreeMem(Bfr);
    freeandnil(f);
  end;
end;

Client type er: ctNonBlocking.

Er der nogen der ved hvad jeg gør galt eller har en idee til hvordan man ellers kan overføre filer ved brug af client og server socket ?
Avatar billede janbb Juniormester
17. november 2003 - 07:01 #1
Det er sikkert noget mere specifikt du er ude efter, men v.hj.a. en gratis component fra cgiexpert.com der kaldes httpgeneralengine kan du lave file upload med en kode som:
unit FileUpload1D;
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  HttpEng, GenEng, HUtils;

type
  TDataModule1 = class(TDataModule)
    GeneralHttpEngine1: TGeneralHttpEngine;
    procedure GeneralHttpEngine1ExecRequest(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DataModule1: TDataModule1;

implementation

{$R *.DFM}

procedure TDataModule1.GeneralHttpEngine1ExecRequest(Sender: TObject);
var
  Dest : String;
begin
  // Produce the form for file upload
  PutLine('<HTML><HEAD><TITLE>CGI Expert FileUpload 1</TITLE></HEAD>');
  PutLine('<BODY BGCOLOR=#F5F5F5><CENTER><H1>File upload example 1</H1>');
  PutLine('<FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="'+ScriptName+'">');
  PutLine('<TABLE BGCOLOR=#F5F5F5>');
  PutLine('<TR><TD>Upload the following file:</TD><TD><INPUT TYPE="FILE" NAME="FILE"></TD></TR>');
  PutLine('<TR><TD COLSPAN=2 ALIGN=CENTER><INPUT TYPE=SUBMIT NAME="UPLOAD" VALUE="Upload the file">');
  PutLine('<INPUT TYPE=RESET NAME=RESET VALUE="RESET"></TD><TR>');
  PutLine('</TABLE>');

  // Check for any fileupload
  if FormVar('FILE_FILENAME','')>'' then
  begin
    // Yes, a file has been uploaded

    // Set destination filename on server
    Dest:=ExtractFileDir(ExeOrDllPath) + '\'+ExtractFileName(FormVar('FILE',''));


    // Delete file if already exists
    if FileExists(Dest) then
      DeleteFile(Dest);

    // Try to move the file to the directory of the
    if RenameFile(FormVar('FILE_FILENAME',''),Dest) then
    begin
      PutLine('<font color="green">The file "' + FormVar('FILE','') +'" on client, having type "' + FormVar('FILE_CONTENT_TYPE','')+'",');
      PutLine('<BR> has successfully been saved on server.</font>');
    end
    else
      PutLine('<font color="red">Failed to rename file:'+Dest+','+ FormVar('FILE','')+','+FormVar('FILE_FILENAME','')+ '</font>');
  end;

  PutLine('</BODY></HTML>');
end;

end.
Avatar billede tillon Nybegynder
17. november 2003 - 18:29 #2
Nej desvære .. jeg leder efter noget det passer til client og serversocket!
Avatar billede tillon Nybegynder
18. november 2003 - 16:50 #3
Skal der flere point til eller er der bare ikke nogen der har nogle konstruktive ideer !?
Avatar billede tillon Nybegynder
10. august 2005 - 13:39 #4
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester