Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
|
Re: Datei senden über TCP macht nur die halbe Arbeit
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.
|
|
Zitat
|