Ich hab das Prog soweit fertig, dass es die Grundfunktionen erfüllt! Hier ist sind die Stücken aus dem Quellcode, die zur Übertragung von Daten wichtig sind:
Delphi-Quellcode:
procedure TMain.SendBtnClick(Sender: TObject);
begin
try
TCPClient.Connect(5);
TCPClient.WriteLn(BN+': '+MsgEdit.Text);
WriteMsg(BN+': '+MsgEdit.Text);//BN = Benutzername
MsgEdit.Clear;
finally
TCPClient.Disconnect;
end;
end;
procedure TMain.TCPServerExecute(AThread: TIdPeerThread);
var
FS: TFileStream;
SizeOfIncomingStream: integer;
S, Fromuser, NameofFile, SizeofStream: String;
begin
SDia.FilterIndex := 1;
SDia.DefaultExt := '';
with AThread.Connection do begin
try
S := Readln('', 5);
if not (Pos('#@#START', S) = 1) then begin
WriteMsg(S);//WriteMsg -> zum formatierten Hinzufügen in die Richeditkomponente
end;
if (Pos('#@#START', S) = 1) then begin
WriteLog('Empfange Datei!');(*WriteLog-> zum formatierten Hinzufügen von Logbuchnachrichten (auch in die selbe Richedit)*)
FromUser := CopyFT(S, Pos('|', S)+1, Length(S));
Write('Sender: '+Fromuser);
NameofFile := Readln('', 5);
WriteLog('Dateiname: '+NameofFile);
SizeofStream := Readln('', 5);
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);//SDia und ODia -> Save/OpenDialog
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;
procedure TMain.SendFileBtnClick(Sender: TObject);
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;
function TMain.MakeSize(ASize: Integer): String;//Zum Anzeigen der Größe in einer geeigneten Einheit
var
I: integer;
Size2: Real;
Einheit: String;
begin
Einheit := 'Bytes';
Size2 := ASize;
if Size2 > 1024 then begin
Size2 := Runde(ASize/1024, 2);
Einheit := 'KB';
end;
if Size2 > 1024 then begin
Size2 := Runde(Size2/1024, 2);
Einheit := 'MB';
end;
if Size2 > 1024 then begin
Size2 := Runde(Size2/1024, 2);
Einheit := 'GB';
end;
Result := FloatToStr(Size2)+' '+Einheit;
end;
Das Nachrichten senden funtzt einwandfrei! Aber das Dateiensenden funtzt nicht, manchmal gehts, manchmal nicht.(Habs im LAN probiert) Wenn ich mal keine Textdatei, sondern eine wavdatei verschicke, ist sie Nachher ein bisschen kleiner und man hört nurnoch die Hälfte! Irgendwas scheint falsch zu sein! Ich weiß nicht was da ist!
Manchmal wird zwar irgendwas versendet (beim Dateiversenden), aber es kommt weder eine Botschaft an, noch die Datei!