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):
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 public 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); AContext.Connection.IOHandler.Write('ANSWER'); end;
end. |
Einzige Komponente auf dem Formular ist ein TIdTCPServer.
Code des Client (INDY):
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 public 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.