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:
...
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;
...
Beim Erstellen eines Verbinungsthreads erstelle ich einen TListItem und gebe diesen an den Thread weiter:
Code:
...
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;
...
Der Thread ergänzt dann den Item mit empfangenen Identifikationsdaten des Clients.
Wenn ich dann an einen bestimmten Client etwas senden möchte:
Code:
...
var
Item: TLietItem;
begin
Item := ListView1.ItemFocused;
if assigned(Item.Data) then
TServerClientThread(Item.Data).ClientSocket.SendText('irgendein Text')
end;
...
oder an alle Clients:
Code:
...
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;
...
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.
Was den nun? Hat jemand einen Code-Beispiel? Wäre sehr dankbar!
MfG,
Ralfi