Frage

Ich erstelle einen TCP -Server, der mehrere Clients empfängt und in der Lage sein muss, Nachrichten an jeden zu senden.

Wie bekomme ich einen Handlungsverbinden und sende dann beliebige Daten?

Danke: D

Code:

procedure TFRM_Main.ServerConnect(AContext: TIdContext);
var lAdd: TListItem;
var Index: integer;
begin
  lAdd := ListView.Items.Add;
  //AContext connection ID, what to do here?
  lAdd.Caption := IntToStr(Index);
end;
War es hilfreich?

Lösung

verwenden:

AContext.Connection.IOHandler.Write( (* bytes *) );
AContext.Connection.IOHandler.WriteFile( (* send a file to the client *) );

Weitere Optionen für Optionen finden Sie einfach den Code -Abschluss (Strg+Space) nach ioHandler und sehen Sie vor, vor einiger Zeit habe ich eine einfache Client/Server -Test -App geschrieben. Klicken Sie auf. hier Quelle sehen und/oder herunterladen.

Andere Tipps

TIdTCPServer ist eine Multithread -Komponente. Zugriff auf die Benutzeroberfläche direkt von innerhalb ihrer OnConnect Ereignis (oder OnDisconnect, OnExecute, oder OnException) ist nicht threadssicher! Sie müssen Indys verwenden TIdSync oder TIdNotify Klasse, um sicher auf die Benutzeroberfläche zuzugreifen.

Um die ursprüngliche Frage zu beantworten, ist der Einfachste, aber nicht unbedingt der sicherste Weg, die zu speichern TIdContext.Connection Objektzeiger in der TListItem.Data Eigentum. Der Haupt -Thread -Code hat dann direkten Zugriff auf die Verbindung, wenn sie sie benötigt.

Ich rate das jedoch nicht. Eine sicherere Lösung besteht darin, jeden Kunden selbst eindeutig zu identifizieren, z. B. mit einem Benutzernamen, den der Kunde sendet TIdContext.Data und TListItem.Data Eigenschaften. Wenn Ihr Haupt -Thread -Code dann eine Nachricht an einen Client senden möchte, kann er die durch die Durchschläge durch die TIdTCPServer.Contexts Liste auf der Suche nach der gewünschten Person TIdContext.Connection Objekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top