Entwickler-Ecke

Internet / Netzwerk - IDTCPSERVER Threads erstellen


Jerk - Do 27.09.07 00:59
Titel: IDTCPSERVER Threads erstellen
Nachdem mein erster Thread zu diesem thema leider unbeantwortet bliebt habe ich noch eine weile gegooogelt und auch halb eine Lösung gefunden.
Ich möchte vom Server aus an alle clients die Connected sind eine Nachricht senden, dazu soll man ja Eine Liste mit den einzelnen Clients erstellen das hab ich so gelöst:


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:
var
  Form1: TForm1;

  fClientlist : TList;

type
  TClientClass = class
    fAthread : TIDPeerThread;

  end;
implementation

{$R *.dfm}

procedure TForm1.ServerConnect(AThread: TIdPeerThread);
begin
  AThread.Data:= TClientClass.Create();
  fClientList.Add(AThread.Data);
  TClientClass(AThread.Data).fAThread:= AThread;
end;

procedure TForm1.ServerDisconnect(AThread: TIdPeerThread);
begin
  fClientList.Delete(fClientList.IndexOf(AThread.Data));
end;

procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var
  i: integer;
begin

// --- Sendet an alle Client eine message wenn ein Client sich meldet ----

  for i:=0 to fCLientList.Count-1 do begin
    if TClientClass(fClientList[i]).fAThread.Connection.Connected then begin
      TClientClass(fClientList[i]).fAThread.Connection.WriteLn('Hallo');
    end;
  end;
end;


Mein Problem an der Sache ist das der Client beim Connecten gleich die Meldung bekommt:"Connection closed gracefully"

Was mache ich hier falsch?


Narses - Do 27.09.07 01:39

Moin und :welcome: im Forum!

Bei den Indies ist doch ein Chat-Demo mit dabei. Hast du dir das schonmal angesehen? :les: :?: Das sollte eigentlich deinem aktuellen Problem sehr nahe kommen. :idea: ;)

cu
Narses


Jerk - Do 27.09.07 02:50

Hmm in dem Demo Ordner ist HTTP und Mail drinne, keine Demo die mir helfen kann denke ich :(

Ich würde aber auch lieber verstehen was an meinem Quellcode falsch ist.
Andererseits wo finde ich die Demo, ist Indy Version 9.


Noch eine Sache
beim client habe ich nen Timer der pro sekunde readln macht, dazu nen Antifreeze und halt kurzen Timeout.
Wenn ich nun das Programm beenden will dachte ich sollte wohl erst der timer stoppen und der Client disconnecten, jedoch hilft das nicht bei dem Problem das sich der Client nurnoch über den Taskmanager schliessen lässt -.-


Narses - Do 27.09.07 09:42

Moin!

user profile iconJerk hat folgendes geschrieben:
Hmm in dem Demo Ordner ist HTTP und Mail drinne, keine Demo die mir helfen kann denke ich :(
[...]
Andererseits wo finde ich die Demo, ist Indy Version 9.

Die Indy-9-Demos kannst du hier runterladen [http://www.projectindy.org/DemoDownloads/Indy9Demos_26Oct04.zip]. ;)

cu
Narses


Jerk - Do 27.09.07 13:56

Hmm das is ja noch ne Ecke komplizierter. Wird wohl ne Weile dauern das alles zu verstehen. Aber warum bei meiner Version immer connection closed gracefully kommt weis keiner oder?


Narses - Do 27.09.07 15:28

Moin!

user profile iconJerk hat folgendes geschrieben:
Aber warum bei meiner Version immer connection closed gracefully kommt weis keiner oder?

Schonmal gesucht? Suche in: Delphi-Forum, Delphi-Library CONNECTION CLOSED GRACEFULLY :les: ;)

cu
Narses


Jerk - Do 27.09.07 22:39

Danke erstmal für die Antowrten...

Was die Meldung bedeuted weis ich warum sie kommt verstehe ich nach wie vor nicht, ist aber inzwischen egal.
--

Zu dem Demoprogramm, in dem Code des clients ist ja dieser Abschnitt zu findne:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TClientHandleThread.Execute;
begin
  beep; // Hab ich hinzugefügt um zu wissen wann dieser Programmteil arbeitet
  while not Terminated do
  begin
    if not ClientFrmMain.Client.Connected then
      Terminate
    else
    try
      ClientFrmMain.Client.ReadBuffer(CB,sizeof(cb));
      Synchronize(HandleInput);
    except
    end;
  end;
end;


Liege ich richtig in der annahme das diese Procedure durch einen connect und einen Buf der vom Server kommt ausgelöst wird?
Wenn das mit dem Buff stimmt wie muss der aussehen damit das funktioniert, weil wenn ich einen einfachen String als Buff sende passiert nichts