Autor Beitrag
Frolo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: So 04.11.12 03:27 
Hey,

ich habe ein Problem: Ich versuche eine Anwendung zu schreiben, bei der sich ein Client immer versucht zu einem Server (ebenfalls selbstgeschrieben) in einem Netzwerk zu verbinden. Das ist auch alles okay. Ich finde bei Indy, bei dem TCP-Client eine Procedure zum Senden eines Strings und beim Server ein Event zum Empfangen. Aber das war es auch schon. Wie kann ich den Server mit dem Client kommunizieren lassen?


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am So 04.11.2012 um 14:02
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: So 04.11.12 11:30 
Nur eine Server wartet auf Anfragen und antwortet.
Du könntest auf beiden Seiten jeweils einen Server und Client vorhalten.
Besser wird es allerdings sein, die Verbindung einfach offen zu halten, dann kann der Server auf alle offenen Verbindungen "rausschreiben".
Allerdings empfinde ich hierfür die Indy's als weniger geeignet und verwende für so etwas lieber TTCPServer und TTCPClient, da ich dort das Handling in den Threads selbst im Griff haben.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19273
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 04.11.12 11:37 
Man muss nur wissen wie man das mit den Indy-Komponenten macht. ;-) Ich gebe zu, dass das Threadhandling usw. nicht unbedingt ganz eindeutig ist, und wenn man es falsch macht, gibt es schöne Fehler. Aber wenn man es erst einmal kennt, ist das schon schön.
Nicht umsonst baut DataSnap ebenfalls auf den Indy-Komponenten auf.

Ansonsten gäbe es auch noch UDP um einen Broadcast an alle Clients im selben Netzwerksegment zu schicken.
Frolo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: Di 06.11.12 00:32 
Also das Prinzip ist folgendes: Ein oder mehrere Clients verbinden sich mit dem Server. Die Verbindung zu den Clients wird auch aufrecht erhalten. Ich muss aber vom Server aus einem beliebigen Client einen String/Stream schicken können, der dann auch wirklich nur bei ihm ankommt. Also kein Broadcast. Wie realisiere ich das? Habs wie gesagt mit Indy versucht und finde da beim IdTCPServer garkeine Routine für das senden eines Strings an eine bereits verbundenen Client und auf der anderen Seite, beim IdTCPClient auch kein Event, das ausgelöst wird, wenn der eine Nachricht bekommt..
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 06.11.12 01:37 
bei nicht Indys wird im Server für jede Anfrage ein Thread generiert der sich bis zur Trennung kümmert.
Der Client würde in Deinem Fall in einem Thread erzeugt und würde pollen.
Mit den Indys wird es ähnlich ablaufen oder möglich sein, allerdings ist Sebastian in den Dickicht sicher der berufenere Antworter.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19273
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 06.11.12 10:04 
Im Client reicht ein Timer, der immer mal wieder schaut, ob etwas da ist. Sinnvollerweise natürlich mit einem eigenen Protokoll, damit du weißt wo Nachrichten zu Ende sind, aber als ganz simples Beispiel (ungetestet):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  // Client connect
  MyIdTcpClient.Connect;
  
  // im Timer empfangen
  if MyIdTcpClient.Connected and (MyIdTcpClient.IOHandler.InputBuffer.Size > 0then
    ShowMessage(MyIdTcpClient.IOHandler.ReadString(MyIdTcpClient.IOHandler.InputBuffer.Size));

  // Nachricht senden
  Client.IOHandler.Write('Hallo');
Und im Server um an alle Clients eine Nachricht zu schicken:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  ContextList: TList;
  i: Integer;
begin
  ContextList := MyIdTcpServer.Contexts.LockList;
  try
    for i := 0 to ContextList.Count - 1 do
      TIdContext(ContextList[i]).Connection.IOHandler.Write('Hallo vom Server');
  finally
    MyIdTcpServer.Contexts.UnlockList;
  end;
Ein Chat-Beispiel ist für Indy 10 auch verfügbar, die muss nur ein wenig auf die aktuelle Indyversion angepasst werden. Das sollte aber mit den Code-Schnippseln von mir kein Problem sein.
Frolo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: Di 06.11.12 21:19 
Danke Sebastian, das war genau das, was ich gesucht hab! Ich mag nämlich wirklich nur ne pure Serveranwendung und ne pure Clientanwendung