Einzelnen Beitrag anzeigen

Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#4

Re: Datei senden über TCP macht nur die halbe Arbeit

  Alt 14. Jun 2004, 15:47
Hier erstmal der Code:
Delphi-Quellcode:
//Procedure zum Textnachrichten senden:
begin
 try
   TCPClient.Connect(5);
   TCPClient.WriteLn(BN+': '+MsgEdit.Text);
   WriteMsg(BN+': '+MsgEdit.Text); //Zum Chatnachrichten im eigenen Prog in ein RichEdit eintragen
   MsgEdit.Clear;
 finally
   TCPClient.Disconnect;
 end;
end;

//Procedure zum Dateien versenden:
var
  FS: TFileStream;
begin
 if not ODia.Execute then Exit;

 with TCPClient do begin
   FS := TFileStream.Create(ODia.FileName, fmOpenRead or fmShareDenyWrite);
   if MessageDlg('Folgende Datei möchten sie verschicken:'+#13#10#13#10+
                 'Dateiname: "'+ODia.FileName+'"'+#13#10+
                 'Größe: '+MakeSize(FS.Size)+#13#10#13#10+
                 'Möchten sie sie an "'+TCPClient.Host+'" senden?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then Exit;
     Connect;
   try
       OpenWriteBuffer;
     try
       WriteLog('Übertrage Dateiinfos...');
       WriteLn('#@#START|'+BN);
       Writeln(ODia.FileName);
       Writeln(MakeSize(FS.Size));
       WriteLog('Dateitransfer beginnt...');
       WriteStream(fs, true, true, 0);
       CloseWriteBuffer;
       WriteLog('Dateitransfer beendet');
     except
       CancelWriteBuffer;
     raise;
     end;
   finally
     Disconnect;
     FS.Free;
   end;
 end;
end;

//Procedure zum Empfangen:
var
  FS: TFileStream;
  SizeOfIncomingStream: integer;
  S, Fromuser, NameofFile, SizeofStream: String;
begin
 SDia.FilterIndex := 1;
 SDia.DefaultExt := '';
 with AThread.Connection do begin
  try
   S := Readln;

   if not (Pos('#@#START', S) = 1) then begin
      WriteMsg(S);
   end;

   if (Pos('#@#START', S) = 1) then begin
      WriteLog('Empfange Datei!'); //Träft auch in Richedit ein, aber in anderer Frabe, daher extra Procedure
      FromUser := CopyFT(S, Pos('|', S)+1, Length(S));
      Write('Sender: '+Fromuser);
      NameofFile := Readln;
      WriteLog('Dateiname: '+NameofFile);
      SizeofStream := Readln;
      WriteLog('Größe: '+SizeofStream);
      if MessageBox(Application.Handle, PChar(FromUser+' schickt ihnen die Datei "'+NameofFile+'", die '+SizeofStream+' groß ist.'+#13#10+#13#10+'Wollen sie sie annehmen?'), 'Frage', MB_YESNO) = IDYes then begin
         SDia.FileName := ExtractFileName(NameofFile);
         if SDia.Execute then begin
            try
              Fs := TFileStream.Create(SDia.Filename, fmCreate or fmShareExclusive);
              SizeOfIncomingStream := ReadInteger;
              WriteLog('Datei wird runtergeladen...');
              ReadStream(fs, SizeOfIncomingStream);
              WriteLog('Transfer erfolgreich abgeschlossen!');
              WriteLog('Datei wurde unter "'+SDia.FileName+'" gespeichert!');
            finally
              Fs.Free;
            end;
         end;
      end;
   end;
  finally
   Disconnect;
  end;
 end;
end;
Ein Prob war am Anfang, dass unterschieden werden musste, ob eine einfache Nachricht reinkommt, oder eine Datei.
  Mit Zitat antworten Zitat