Autor Beitrag
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Di 10.09.13 11:29 
Hallo Freunde,

da ist er wieder: Der Wald, den ich vor lauter Bäumen nicht sehe.

Ich hab hier eine winzige Projektgruppe. Projekt 1 ist eine extrem spartanische Serveranwendung. Projekt 2 ist die dazu passende Client-Anwendung. Alles läuft so weit prima, der Client verbindet sich mit dem Server, der Server merkt das. Der Client kann Daten zum Server schicken, der Server kriegt das mit und schickt eine Antwort zurück - die nie beim Client ankommt.

Ich habe das zuerst mit INDY10 versucht, mit denen ich nun schon seit Jahr und Tag umgehe und treffe auf dieses Phänomen. Dann habe ich das ganze Mikro-Projekt neu gebaut, diesmal mit TTCPServer/TTCPClient. The same. Falls es von Nutzen ist: Beide Programme laufen auf demselben Rechner - wenn das schon nicht funtioniert, dann gehts mit getrennten Rechnern erst recht nicht - so meine Ansicht.

Compiler ist D2010. Wo ist der blöde Baum, der mir den Blick auf den Wald versperrt ?

Code der Server-Anwendung (INDY):
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:
unit TCPServerTest;

interface

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

type
  TForm4 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    procedure IdTCPServer1Execute(AContext: TIdContext);
    procedure IdTCPServer1Connect(AContext: TIdContext);
    procedure IdTCPServer1Disconnect(AContext: TIdContext);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.IdTCPServer1Connect(AContext: TIdContext);
begin
     ShowMessage(Format('Connected with %s:%d',[AContext.Binding.PeerIP, AContext.Binding.PeerPort]));
end;

procedure TForm4.IdTCPServer1Disconnect(AContext: TIdContext);
begin
     ShowMessage(Format('Disconnected from %s:%d',[AContext.Binding.PeerIP, AContext.Binding.PeerPort]));
end;

procedure TForm4.IdTCPServer1Execute(AContext: TIdContext);
var
   s: string;
begin
     s:=AContext.Connection.IOHandler.ReadLn;
     ShowMessage('SERVER: '+s); //Kann ich auch weglassen, ändert nix
     AContext.Connection.IOHandler.Write('ANSWER'); //Kommt nie an
end;

end.


Einzige Komponente auf dem Formular ist ein TIdTCPServer.

Code des Client (INDY):
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:
unit tcpclienttest;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Sockets, StdCtrls, IdContext, IdTCPConnection, IdTCPClient,
  IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, IdGlobal;

type
  TForm3 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    IdTCPClient1: TIdTCPClient;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure IdTCPClient1Work(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Int64);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
     IdTCPClient1.Connect;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
     IdTCPClient1.Disconnect;
end;

procedure TForm3.Button3Click(Sender: TObject);
begin
     IdTCPClient1.IOHandler.WriteLn('QUESTION');
end;

procedure TForm3.IdTCPClient1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
var
   s: string;
begin
     s:=IdTCPClient1.IOHandler.ReadLn;
     ShowMessage('CLIENT: '+s);
end;

end.


Auf dem Formular gibts 3 Buttons (Connect, Send, Disconnect) und den TIdTCPClient.

Verwendete Portadresse ist 4225 (Firewall hat sich ordnungsgemäß gemeldet, Portadresse ist freigegeben). Als IP-Adresse habe ich sowohl localhost, 127.0.0.1 als auch die feste Rechner-IP versucht. Stets das gleiche Verhalten, Client -> Server geht, direkte Antwort Server -> Client kommt nie an.

[Edit]Nu habe ich den Zweck des ganzen völlig vergessen: Im Endzustand bekommt mein Server via UDP von irgendwoher Daten angeliefert, die dann grob aufbereitet an eben diesen TCP-Client weitergegeben werden sollen. Ich habe über UDP nachgedacht, aber das Risiko, das einer oder zwei meiner Datenblocks nicht ankommen, ist mir einfach zu groß. Von der Vollständigkeit der Anzeige hängen ziemliche Bußgelder im Straßenverkehr ab ;)
[/Edit]

Ich verzweifel hier gleich :-(

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Quitzlinga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: Di 10.09.13 12:35 
Hi,

Zitat:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm3.IdTCPClient1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
var
   s: string;
begin
     s:=IdTCPClient1.IOHandler.ReadLn;
     ShowMessage('CLIENT: '+s);
end;



das Ereignis "OnWork" ist nur für Statusmeldungen zu gebrauchen aber nicht zum Lesen. Es wird keinesfalls ausgelöst, wenn neue Daten am Client ankommen (Zumindest nicht ohne den Aufruf weiterer Indi-Routinen (ReadStream, ReadLn, etc).
Es zeigt Dir nur den Fortschritt an während andere die Arbeit machen.

Wenn Du überprüfen willst, ob Daten vom Server vorliegen, dann musst Du das selbst erledigen. Am besten in einem Thread damit die Anwendung nicht blockiert.

MfG

Quitzlinga
OlafSt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Di 10.09.13 14:20 
Oh mann *kopfklatsch*

Ich hasse diese absolut uzureichende Dokumentation, die einfach überhaupt nicht weiterhilft. Schande über Emba, das sie solchen Mist sich trauen abzuliefern.

Problem gelöst, danke für die Aufklärung !

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.