![]() |
String an alle Socket-Connections senden???
Hallo!
Für jede neue Verbindung zum ServerSocket (stThreadBloking) wird einen neuen TServerClientThread erstellt. Gleich zwei Fragen: 1. Wie kann ich einen String an alle Connections senden? 1. Wie kann ich einen String an eine bestimmte Connection senden? Danke! MfG, Ralfi |
Re: String an alle Socket-Connections senden???
Zitat:
Dazu musst also für jeden Socket ein Objekt haben, wo du Informationen über den Client speicherst. Du kannst auch an dieses Objekt den Socket hängen (halt andersrum als ich oben erklärt habe). Dann kannst du über die ObjektListe laufen, etwa so:
Delphi-Quellcode:
Dazu musst du beim Anmelden des Benutzers ein TBenutzer-Objekt anlegen, es in die Liste
for i:=0 to Pred(BenutzerListe.Count) do
if TBenutzer(BenutzerListe[i]).Nickname = 'Stevie' then TBenutzer(BenutzerListe[i]).Socket.SendText('Hallo Stevie!'); einfügen und die Eigenschaften setzen. Beim Abmelden muss es aus der Liste wieder entfernt werden. |
Re: String an alle Socket-Connections senden???
Ja, aber wie speichere ich den Socket in einer Liste? Ich habe schon versucht, den Socket-Pointer im Data-Eingenschaft eines TListItems zu speichern. Ich habe damals für jede Verbindung einen ListView-Items erstellt, in dem ich spezifische Verbindungsinformationen darstellte. Etwa so:
Code:
Beim Erstellen eines Verbinungsthreads erstelle ich einen TListItem und gebe diesen an den Thread weiter:
...
type ServerClientThread = class(TServerClientThread) constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket; ItemX: TListItem); private { Private declarations } protected Line: string; Item: TListItem; procedure ClientExecute; override; procedure AddItem; procedure DeleteItem; end; ... ... constructor ServerClientThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket; ItemX: TListItem); begin inherited Create(CreateSuspended, ASocket); Item := ItemX end; ...
Code:
Der Thread ergänzt dann den Item mit empfangenen Identifikationsdaten des Clients.
...
procedure TForm1.ServerSOcket1GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread); var Item: TlistItem; begin Item := ListView1.Items.Add; SocketThread := ServerClientThread.Create(true, ClientSocket, Item); Item.Data := Pointer(SocketThread); SocketThread.Resume end; ... Wenn ich dann an einen bestimmten Client etwas senden möchte:
Code:
oder an alle Clients:
...
var Item: TLietItem; begin Item := ListView1.ItemFocused; if assigned(Item.Data) then TServerClientThread(Item.Data).ClientSocket.SendText('irgendein Text') end; ...
Code:
Zumindest ich habe es mir so vorgestellt. Die obige Code fuktioniert aber nicht. Die Threads werden normal erstellt, Item wird hinzufügt, alles wunderbar - bis auf Senden von Informationen. Sobald ich etwas wie oben beschrieben senden möchte, hängt sich der Server auf.
...
var i: integer; begin for i := 0 to ListView1.Items.Count - 1 do begin if assigned(ListView1.Items.Item[i].Data) then TServerClientSocket(ListView1.Items.Item[i].Data).ClientSocket.SendText('irgendein Text') end; end; ... Was den nun? Hat jemand einen Code-Beispiel? Wäre sehr dankbar! MfG, Ralfi |
Re: String an alle Socket-Connections senden???
Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin SocketList.Add(Socket); end; |
Re: String an alle Socket-Connections senden???
Und was ist dann diese SocketList? :freak:
|
Re: String an alle Socket-Connections senden???
Ein stinknormales TList-Object! ;-)
|
Re: String an alle Socket-Connections senden???
OK, du meinst vielleicht, ich soll eine SocketHandle in einer Liste speichern. Wie kann ich dann eine Nachricht an einen bestimmten Client senden, wenn ich die SocketHandle des Client kenne?
|
Re: String an alle Socket-Connections senden???
|
Re: String an alle Socket-Connections senden???
Wie ich das sende, das weiß ich! Wo, verdammt, stecke ich beim senden den SocketHandle rein - das verstehe ich nicht! Könntest du vielleicht so nett sein und code für Senden-Vorgang posten? Denn das kann so ohne Ende weitergehen. Angenommen, ich habe den SocketHandle eines Clients. Ich möchte Ihm eine Nachricht senden. Die Code
Code:
wird sicher nicht funktionieren, oder?
TCustomWinSocket(hier den SocketHandle).SendText(blablabla)
|
Re: String an alle Socket-Connections senden???
SocketHandle ist was anderes...
Delphi-Quellcode:
for i:=0 to Pred(SocketList.Count) do
if SocketList[i].Data = SuchObjekt then TCustomWinSocket(SocketList[i]).SendText(Blabla); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz