Einzelnen Beitrag anzeigen

night

Registriert seit: 23. Jun 2006
22 Beiträge
 
Turbo Delphi für Win32
 
#1

Re: Indy-TCP-Server aufsetzen und Dateien versenden

  Alt 17. Okt 2008, 16:53
Dieser Beitrag stand ursprünglich in Zusammenhang mit diesem Tutorial:
Indy-TCP-Server aufsetzen und Dateien versenden



Hi,der Beitrag ist schon etwas älter, passt aber zu meinem Thema.
Hier wurde gezeigt, wie man vom Client eine Datei zum Server schicken kann. Ich möchte aber nun eine Datei von einem Client zum anderen schicken.
Ich habe mir dazu folgendes überlegt, bzw von oben übernommen:

Client:
Delphi-Quellcode:
if OpenDialog1.Execute then
    begin
      //Data= Befehl; Receiver = an wen die Datei geht und Dateiname
      Msg := '!DATA~'+receiver+'~'+OpenDialog1.FileName;
      FTCPClient.WriteLn(MSG);
      FileStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyNone);
      try
        MyFileSize := FileStream.Size;
        while MyFileSize > 0 do
        begin
          SendSize := MyFileSize;
          if SendSize > 1024 then
            SendSize := 1024;
          Dec(MyFileSize, SendSize);
        FTcpClient.WriteStream(FileStream, False, False, SendSize);
      end;
      finally
       FileStream.Free;
      end;
    end;
Der Server:
Delphi-Quellcode:
procedure TForm1.tcpServerExecute(AThread: TIdPeerThread);
var Msg: String;
    receiver: String;
    MyFileName: String;
    FileStream: TFilestream;
    list: TList;
    MyFileSize: int64;
begin
  msg := AThread.Connection.ReadLn;
  if Msg[1] = '!then
  begin
   Msg := Trim(Copy(Msg, Pos('!', Msg) +1, Length(Msg)));
   if Trim(Copy(Msg, Pos('!', Msg) +1, Pos('~', Msg))) = 'DATAthen
   begin
    Msg := Trim(Copy(Msg, Pos('~', Msg) +1, length(Msg)));
    Receiver := Trim(Copy(Msg,1, Pos('~', Msg)));
    MyFileName := Trim(Copy(Msg, Pos('~', Msg) +1, length(Msg)));
      
    FileStream := TFileStream.Create(MyFileName, fmCreate);
    try
      AThread.Connection.ReadStream(FileStream, MyFileSize);
      List := FtcpServer.Threads.LockList;
      try
       msg := '!DATA~';
TIdPeerThread(List.Items[ListBox_Server_Clients.Items.IndexOf(Receiver)]).Connection.WriteLn(msg); TIdPeerThread(List.Items[ListBox_Server_Clients.Items.IndexOf(Receiver)]).Connection.WriteStream(FileStream, False, False, Filestream.Size);
      finally
        FtcpServer.Threads.UnlockList;
      end;
    finally
      FileStream.Free;
    end;
   end
  end;
end;
Und dann wieder beim Clienten:
Delphi-Quellcode:
procedure TForm1.ReceiveMessage;
var Msg: String;
    command: String;
    FileStream: TFilestream;
    MyFileSize: int64;
begin
  if FTcpClient.Connected then
  begin
    if (Msg[1] = '!') then
    begin
        command := (Trim(Copy(Msg, Pos('!', Msg)+1, Pos('~', Msg) -2)));
        if command ='DATAthen
        begin
          if SaveDialog1.Execute then
          begin
            FileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate);
            try
              FTCPClient.ReadStream(FileStream, MYFileSize);
            finally
              FileStream.Free;
            end;
           end;
        end;
      end
   end;
end;
Ich will damit einen bestehenden Chat, den ich letztes Jahr gemacht habe, um einen Filetranfer erweitern und habe alles Coding, das nichts damit zu tun hat rausgeschmissen(deswegen kann evt ein "end" zu viel oder zu wenig sein . Leider hängt sich mein Programm auf.
Ich selbst habe bis jetzt nur einfache Nachrichten verschickt (Indy 9) und befinde mich hier auf Neuland. Für Denkanstöße oder Beispiele wäre ich dankebar.

Viele Grüße
Stefan

[edit=fkerber]Thread geteilt, da eigenständige Frage. Mfg, fkerber[/edit]
  Mit Zitat antworten Zitat