Entwickler-Ecke

Internet / Netzwerk - Eine Frage zu Indy


pigfacejoe - Do 28.09.06 17:19
Titel: Eine Frage zu Indy
Guten Tag zusammen,
Ich will ein Programm schreiben, mit dem ich den Inhalt eines memos an einen anderen PC senden kann.Also sozusagen einen Newsletter: Ich schreibe etwas in das memo und versende es an jeden, der mein programm auf seinem rechner hat.
Ist das irgendwie möglich?-Hab was von indy gehört und mir das einfach mal runter geladen, aber wenn man 0 Ahnung von indy hat, dann bringt das ja nix..^^
Also, ich freue mich über jede Antwort.
Vielen Dank.


Narses - Do 28.09.06 17:34

Moin!

user profile iconpigfacejoe hat folgendes geschrieben:
Ich will ein Programm schreiben, mit dem ich den Inhalt eines memos an einen anderen PC senden kann.Also sozusagen einen Newsletter: Ich schreibe etwas in das memo und versende es an jeden, der mein programm auf seinem rechner hat.
Ist das irgendwie möglich?

Ja, das ist möglich, auch mit den Indy-Komponenten.

Wenn du dich allerdings noch gar nicht mit Netzwerkprogrammierung beschäftigt hast, dann könnte es eventuell einfacher sein, sich (erst)mal mit den Socket-Komponenten zu beschäftigen. Damit kannst du hier einsteigen [http://www.delphi-library.de/topic_Minimaler+LANInternetChat+mit+TServerTClientSocket_60744.html]. Später kannst du ja jederzeit wieder auf den Indies aufsetzen. ;)

Um die Antwort auf die sicher kommende Frage gleich vorwegzunehmen: ja, ich weiß, dass du keinen Chat programmieren willst, aber wenn du das kannst, dann kannst du auch dein Projekt umsetzen. ;) Also, erstmal mit den Grundlagen anfangen, dann weitermachen. :D

cu
Narses


pigfacejoe - Do 28.09.06 17:57

So hab mir das jetzt komplett durchgelesen,ich weiss jetzt wie ich einen TClientSocket dynamisch erstellen kann, aber wie geht das mit dem TServerSocket(sry, ich hab echt 0 Plan^^)?
Gruss
Pigface


Narses - Do 28.09.06 18:04

Moin!

user profile iconpigfacejoe hat folgendes geschrieben:
So hab mir das jetzt komplett durchgelesen,ich weiss jetzt wie ich einen TClientSocket dynamisch erstellen kann, aber wie geht das mit dem TServerSocket(sry, ich hab echt 0 Plan^^)?

In dem Tut-Beitrag am Ende sind Anhänge, da gibt es auch eine Version mit dynamisch erstellten Komponeten; falls du das meinst, weil du möglicherweise nur eine D7PE hast?

Oder habe ich dich falsch verstanden? ;)

cu
Narses


pigfacejoe - Do 28.09.06 18:23

Genau Richtig ich hab eine Dlphi 7 PE,
und unten bei 3. steht ja auch wie ich dann TClientSocket erstellen kann, ich wollte jetzt wissen wie ich denn TServerSocket erstellen kann.
Vielen Dank für die schnelle Antwort!


Narses - Do 28.09.06 23:25

Moin!

user profile iconpigfacejoe hat folgendes geschrieben:
und unten bei 3. steht ja auch wie ich dann TClientSocket erstellen kann, ich wollte jetzt wissen wie ich denn TServerSocket erstellen kann.

Äh, aber das ist doch im gleichen Archiv drin (ChatBasics_dynKompo.zip), der Minimal-Chat mit Server und Client in der dynamischen Kompo-Version. ;)

Oder versteh ich dich immer noch falsch? :gruebel: :nixweiss:

cu
Narses


pigfacejoe - Fr 29.09.06 16:16

Habe den Quelltext, den su geschrieben hast um TClientSocket dynamisch zu erstellen angepasst und nun kommt folgender fehler:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ScktComp;

type
  TForm1 = class(TForm)
  procedure DynConnectEvent(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
      private
    { Private-Deklarationen }
  public
  ClientSocket1: TClientSocket;
    { Public-Deklarationen }
  end;


[Fehler] Unit1.pas(11): Ungenügende Forward- oder External-Deklaration: 'TForm1.DynConnectEvent'

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


Narses - Fr 29.09.06 16:32

Moin!

a) Bitte die Delphi-Tags verwenden, damit der Quelltext vernünftig dargestellt wird.
b) Zum Fehler: Du hast ja auch keine entsprechende Prozedur geschrieben. ;) Also sagt dir der Compiler völlig zu Recht: da fehlt der Code!

Schau dir doch mal den Code aus dem Archiv genau an, da läuft das doch schon. Brauchst doch nur "nachzumachen". ;)

cu
Narses


pigfacejoe - Fr 29.09.06 20:32

Ich bekomms irgendwie nicht hin..
Bn halt bei sowas ziemlich blöd.
Kann man sich die Komponenten nicht irgendwo downloaden ?
Oder bekomm ich die nicht sonstwo her?


Narses - Sa 30.09.06 10:39

Moin!

user profile iconpigfacejoe hat folgendes geschrieben:
Ich bekomms irgendwie nicht hin..
Bn halt bei sowas ziemlich blöd.

Hm, ist eigentlich gar nicht soo schwer, wundert mich. :? Nicht so schnell aufgeben... ;)

user profile iconpigfacejoe hat folgendes geschrieben:
Kann man sich die Komponenten nicht irgendwo downloaden ?
Oder bekomm ich die nicht sonstwo her?

Ich weiß nicht, ob es irgendwo eine Downloadquelle für die dclsockets70.bpl gibt, aber wenn, dann ist es illegal. :mahn:

Du kannst dir auch z.B. ein Buch kaufen, bei dem D7 dabei ist. Das sind meistens Pro-Versionen, die Zeitlich begrenzt sind. Da ist dann auch dieses Package dabei. So könntest du zumindest in der Testphase die Komponenten in der IDE verwenden. ;)

Aber wie schon gesagt, das ist soo schwer nicht. Wo kommst du denn nicht weiter? Immernoch bei dem Fehler oben stecken geblieben?

cu
Narses


pigfacejoe - Sa 30.09.06 11:05

Hi narses, vielen Dank für deine Geduld,
Aber ich habs jetzt mal mit indy probiert:
Also ich habe einen server und einen Client:
Der server hat folgenden Quelltext:

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:
unit Main;


interface

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

type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    FSend: Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin

  if FSend then begin
    AThread.Connection.WriteLn(memo1.text);
    FSend:=false;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FSend := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FSend := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  IdTCPServer1.Active := True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  IdTCPServer1.Active := False;
end;

end.

In memo1.text trage ich ein,was ich versenden will zu diesem client:

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:
unit Unit13;

interface

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

type
  TForm13 = class(TForm)
    Memo1: TMemo;
    Client: TIdTCPClient;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form13: TForm13;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm13.FormActivate(Sender: TObject);

begin
memo1.text:=' ';
if not fileexists('C:\hausaufgaben'+form1.label1.Caption) then begin
  with Client do begin
    Connect;
    if Connected then begin
      Memo1.Lines.Add(ReadLn(''3000));
      memo1.lines.SaveToFile('C:\hausaufgaben'+form1.label1.caption);

    end;
  end;
end else memo1.lines.loadfromfile('C:\hausaufgaben'+form1.label1.caption);
end ;


procedure TForm13.FormClose(Sender: TObject; var Action: TCloseAction);
begin
client.Disconnect;
end;

end.

So, doch wenn meine Freunde, die nur den Client haben, zu meinem server verbinden sollten, kommt die Fehlermeldung mit "Socket Error #12323(zahl ausgedacht) und Connection refused" Wie kann ich dem Client mitteilen , dass er übers internet den server auf meinem pc anwählt?
Danke,
Cu
Pigface


pigfacejoe - So 01.10.06 12:12

PS: Also wenn ich auf meinem Rechner Client und Server öffne, empfängt der server den Text den ich in memo1 im server eingebe nur azf anderen Rechnern nicht.Wie kann ich dem Client auf einem anderen Rechner jetzt klarmachen , dass er zu meinem Server auf meinem PC zugreift??
Cu
Pigface


pigfacejoe - So 01.10.06 23:25

Könnte nicht jm pls da drüber schauen und mir sagen , wie ich dem Client mitteile, dass er auf dem server auf meinem PC zugreift?
Thx
Cu Pigface


mkinzler - So 01.10.06 23:33

In dem du hier die IP deines Rechners und dien ausgewählten Port angibst.


pigfacejoe - Mo 02.10.06 00:01

Wie finde ich die IP von meinem rechner raus und wo muss ich diese dann eintragen?
Thx,
Pigface


pigfacejoe - Mo 02.10.06 00:49

So Leute,
hab meine IP beim Client in Client.Host= Ip Adresse von meinem PC eingetragen
Eine neue fehlermeldung kommt jtzt bei meinem Freund:
"Connection Timed out"
Ich bin am Verzweifeln-Was mache ich falsch??-Es kann doch nicht so schwer sein ein memo-Inhalt zu verschicken..


Narses - Mo 02.10.06 00:54

Moin!

Wenn Router im Spiel sind, braucht der Router, in dessen Netz der Server läuft, noch ein Portforwarding [http://www.delphi-library.de/topic_Portforwarding++Eine+kleine+Einfuehrung_80904.html] (heißt manchmal auch Virtual Server).

//EDIT: Teste doch einfach mal mit den Chat-Anwendungen aus meinen Tuts (da sind ja fertige EXEcutables bei), damit muss es auf jeden Fall gehen. Wenn nicht, dann hast du ein Konfig-Problem mit deinem Netz (oder dein Kumpel). ;)

cu
Narses


pigfacejoe - Mo 02.10.06 10:38

Also einen Router habe ich nicht ( mein Freund aber),
Ich habe mir Die Demo zu indy 9 heruntergeladen mit Client und server und gestern getestet.Bei dem Client, der nur mein Freund hat, steht die IP von meinem PC unter der Eigenschaft "Host" (Ich denke mal das das meine IP ist^^) So, ich schalte bei mir auf dem pc den Server auf "Active", dann erst connected mein Freund. Nach ca 30 sek. Kommt bei ihm die Fehlermeldung: "Connection Timed out"
Bevor ich die richtige IP im host stehen hatte, kam immer eine andere fehlermeldung , also denke ich dass der client ja irgendwie schon meinen PC gefunden hat.
Trotzdem kommt halt immer die Fehlermeldung.
Also ich habe 2PCs, die aber nicht durch Router verbunden sind (rentiert sich sowieso nicht^^)sie sind verbunden durch Devolo Microlink dLAN duo (über die steckdose).

Danke für deine Antwort!
CU
Pigface


mkinzler - Mo 02.10.06 10:44

Welche IP hat dein Freund den angegeben, eine private IP oder die öffentlich Adresse, welche dein Provider dir zugewiesen hat?


pigfacejoe - Mo 02.10.06 10:48

Mein Freund hat gar nichts angegeben , ich hab bevor ich ihm das Programm geschickt habe meine IP vom PC ngegeben (1.Gehen Sie über Start -> Ausführen -> Eingabe von "cmd" in die "Eingabeaufforderung".
2.Geben Sie im jetzt erscheinenden Fenster "ipconfig /all" ein und warten Sie etwas.
Dann habe ich die IP Adresse unter "ernet NIC" unter "DHCP aktiviert" genommen , Ist das die falsche?


mkinzler - Mo 02.10.06 10:50

Es kommt drauf an, wie du ins Internet gehst. War das ne 10.x.x.x oder 192.168.x.x Adresse?


pigfacejoe - Mo 02.10.06 10:53

Das war ne 192.168.x.x -Adresse
Cu&Thx
Pigface


mkinzler - Mo 02.10.06 10:54

Dann war es die falsche. Wie gehst du ins Internet?


pigfacejoe - Mo 02.10.06 10:56

Ich doppelklicke auf "T-Online Start Center 6.0" und dann auf "Verbindung Ins Internet" oder wie meintest du das?


mkinzler - Mo 02.10.06 10:58

Dann rufe nochmal ipconfig /all auf und schaue nach weiteren Einträgen.


pigfacejoe - Mo 02.10.06 10:59

OK mach ich später muss kurz weg..
Danke für deine Antworten


Narses - Mo 02.10.06 11:54

Moin!

Wie wäre es mit http://www.whatismyip.com im Browser? Ist garaniert die öffentliche. ;)

cu
Narses


pigfacejoe - Mo 02.10.06 12:17

Einmal Klappts ja , aber wenn ich neu ins internet gehe, bekomm ich ja ne andere IP, also funktioniert das ja nur einmal - was für einen newsletter sehr unpraktisch ist^^
Hast du einen idee wie ich das machen kann , dass er immer die richtige IP holt?


mkinzler - Mo 02.10.06 12:21

Melde dich bein dyndns.org an. Dann bekommst du einen dns-Eintrag, den du dann in deinem Programm angeben kannst.


Narses - Mo 02.10.06 12:21

Moin!

Meld dich bei http://www.dyndns.org an und pack dir einen Client wie Suche bei Google DEEENES auf den Rechner, dann klappt das. ;)

cu
Narses


pigfacejoe - Mo 02.10.06 12:23

Was mache ich damit?
Bzw was ist das?
ah sry- habs grad gesehn das mkinzler das schon erklärt hat^^


pigfacejoe - Mo 02.10.06 12:31

So hab mich da angemeldet,
was soll ich jetzt da machen?

Cu
Pigface


mkinzler - Mo 02.10.06 12:35

-Wähle Services->Dynamic DNS-<Add Dynamic DNS

-Suche dir einen Namen ( z.B.pigfacejoe) und eine Domäne ( z.B. dyndns.org) aus.

-Lade einen Updateclient aus.

pigfacejoe.dyndns.org hat dan immer deinee aktuelle IP bzw. wenn du offline bist, die letzte IP.


Narses - Mo 02.10.06 12:36

Moin!

Du mußt da jetzt unter MyServices einen dynamischen Host registrieren. Dann brauchst du noch einen Client (wenn du keinen Router hast, der das kann), der nach der Einwahl deine aktuelle Adresse an dyndns übermittelt. Beispiel siehe oben.

Ansonsten finde ich, könntest du jetzt mal langsam etwas Eigeninitiative zeigen, oder? :roll: ;)

cu
Narses

//EDIT: mein Gott, bin ich heute langsam... :(


pigfacejoe - Mo 02.10.06 12:52

Jaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!!!!
Party Party!
Es funktioniert!
Vielen Dank an euch beide für eure Geduld!!