Autor Beitrag
Baumunk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50

WinXP
Delphi 2005
BeitragVerfasst: Mo 24.10.05 20:15 
Hallo,

Hilfe, Ich bin am verzweifeln :

Ich mochte daten an Server sender und der gibt gleich resultat zurück.
Einfaches beispiel : Clinet sendet ein Zahl zu, Server setzt wert um eins hoch und sendet zurück.

Server :
ausblenden 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:
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPServer1Disconnect(AContext: TIdContext);
    procedure IdTCPServer1Connect(AContext: TIdContext);
    procedure IdTCPServer1Execute(AContext: TIdContext);
  private
    { Private-Deklarationen }
    C : TIdContext;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
Var I : Integer;
begin
  if not AContext.Connection.IOHandler.Readable Then Exit;
  I := AContext.Connection.IOHandler.ReadInteger;
  AContext.Connection.IOHandler.Write (Integer (I + 1));
end;


Client :
ausblenden volle Höhe 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:
  TMyTCPClient = Class (TIdTCPClient)
  Private
    FTimer : TTimer;
    FOnExecute : TNotifyEvent;
    Procedure DoExecute (Sender : TObject);
  Public
    Constructor Create (AOwner : TComponent); reintroduce;
    Property OnExecute : TNotifyEvent Read FOnExecute Write FOnExecute;
  End;

  TForm1 = class(TForm)
    IdTCPClient1: TIdTCPClient;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    f : TMyTCPClient;
    { Private-Deklarationen }
    Procedure OnExecute (Sender : TObject);
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Constructor TMyTCPClient.Create (AOwner : TComponent);
Begin
  Inherited Create (AOwner);
  FTimer := TTimer.Create (Self);
  FTimer.Enabled := True;
  FTimer.Interval := 25;
  FTimer.OnTimer := DoExecute;
End;

Procedure TMyTCPClient.DoExecute (Sender : TObject);
Begin
  If Not Connected Then Exit;
  If Not IoHandler.Readable (0Then Exit;
  //If not self.Socket.Readable(0) then exit;
  If Assigned (OnExecute) Then { Stelle 1 }
   OnExecute (Self);
End;

constructor TForm1.Create(AOwner: TComponent);
begin
  Inherited;
  f := TMyTCPClient.Create(self);
  f.Host := 'localhost';
  f.Port := 8000;
  f.OnExecute := OnExecute;
  f.Connect;
end;

Procedure TForm1.OnExecute (Sender : TObject);
Var I : Integer;
Begin
  I := f.IOHandler.ReadInteger;
  memo1.Lines.Add(IntToStr (I));
End;

procedure TForm1.Button1Click(Sender: TObject);
Var I : Integer;
begin
  f.IOHandler.Write(Integer (100));
End;


An den Server kommen daten immer, zu Client nie !!
Warum?

In der Procedure DoExecute
ausblenden Delphi-Quelltext
1:
2:
If Not IoHandler.Readable (0Then Exit; { 1}
If not self.Socket.Readable(0then exit; { 2}


IoHandler.Readable (0) und Socket.Readable(0) geben immer False zurück,
als ob keine daten vom Server gibt's. An ahnliche stelle des Servers läuft das.

Was mache ich falsch oder wie soll ich das anders machen.