Entwickler-Ecke

Internet / Netzwerk - Mit Indy Dateien übers Internet senden


Aton - Fr 16.04.04 14:10
Titel: Mit Indy Dateien übers Internet senden
Liebes Forum,

ich weiß, dieses Thema gab es schon einhundert mal. Aber bei mir klappt es einfach nicht!

Erste Frage :?:
Ist es vom Prinzip das gleiche, Dateien übers LAN oder übers Internet zu schicken? Hintergrund ist, dass es bei mir lokal (localhost) klappt, aber nicht mit meiner externen IP übers Internet.

Zweite Frage :?:

Vielleicht sieht den Fehler jemand? Wenn ich beim Client die Internet-IP des Servers eingebe (z.B. von http://www.aida.uni-hannover.de/AIDA/20~Institut/Computer/Eigene_IP-Adresse/Default.asp), kommt immer Verbindungs Time-Out! Die Firewall lässt den Server als Server zu und den Client (anderer Rechner) ins Internet.

Hier das Listing:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
unit TransServer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, StdCtrls,
  IdThreadMgr, IdThreadMgrDefault;

type
  TServerForm = class(TForm)
    Server: TIdTCPServer;
    CBServerAktiv: TCheckBox;
    IdThreadMgrDefault1: TIdThreadMgrDefault;
    procedure CBServerAktivClick(Sender: TObject);
    procedure ServerExecute(AThread: TIdPeerThread);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  ServerForm: TServerForm;

implementation

{$R *.dfm}

procedure TServerForm.CBServerAktivClick(Sender: TObject);
begin
  Server.Active := CBServerAktiv.Checked;
end;

procedure TServerForm.ServerExecute(AThread: TIdPeerThread);
var
  FStream: TFileStream;
begin
  FStream := TFileStream.Create('C:\server.tmp', fmOpenRead);
  try
    AThread.Connection.OpenWriteBuffer;
    AThread.Connection.WriteStream(FStream);
    AThread.Connection.CloseWriteBuffer;
  finally
    AThread.Connection.Disconnect;
    FStream.Free;
  end;
end;

end.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
unit TransClient;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, ExtCtrls;

type
  TClientForm = class(TForm)
    CBClientAktiv: TCheckBox;
    Client: TIdTCPClient;
    Button1: TButton;
    PButtons: TPanel;
    Label1: TLabel;
    EHost: TEdit;
    procedure CBClientAktivClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure EHostChange(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  ClientForm: TClientForm;

implementation

{$R *.dfm}

procedure TClientForm.CBClientAktivClick(Sender: TObject);
begin
  if CBClientAktiv.Checked then
  begin
    try
      Client.Connect(15000);  // in Indy < 8.1 leave the parameter away
    except
      on E: Exception do
        MessageDlg ('Fehler beim Verbinden:'#13+
                     E.Message, mtError, [mbOk], 0);
    end;
  end
  else
  begin
    Client.Disconnect;
  end;

  CBClientAktiv.Checked := Client.Connected;
  PButtons.Enabled := Client.Connected;
end;

procedure TClientForm.Button1Click(Sender: TObject);
var 
  FStream: TFileStream;
begin 
  FStream := TFileStream.Create('C:\client.tmp', fmCreate); 
  try
    Client.ReadStream(FStream, -1, True); // Stream empfangen
    FStream.Seek(0, soFromBeginning);
  finally
    FStream.Free; // Stream freigeben
  end;
end;

procedure TClientForm.EHostChange(Sender: TObject);
begin
  Client.Host := EHost.Text;
end;

end.


Wenn ich auf Button1 klicke, würde ich gern die Datei "server.tmp" empfangen....

Danke für die Mühen,
schönes Wochenende,
Jens.


hibbert - Mi 09.06.04 22:12

hi,
ich habe zwar keine Ahnung von Datei Streams, aber ich habe das mal getestet.

Ich habe mir aus deinen Quelltexten die Komponenten rausgesucht und versendet. Ich habe deine Quelltexte ebenfalls verwendet.

Beim Netzwerk gab es kein Problem.

Und als ich endlich einen freiwilligen an einem anderen PC gefunden habe, da wurde die Datei komplett und fehlerfrei übertragen...

Wichtig ist, dass die Client & Server auf dem gleichen Port laufen und dass du die Internet IP angibst (217.231.223.251).

Ebenfalls sollte der 2. Rechner nicht mit der gleichen IP wie der Server online sein (falls der Client dir Verbindung ins Internet über LAN herstellt.)

mehr kann ich dir zu diesem Zeitpunkt noch nicht berichten.

hibbert