Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi String an alle Socket-Connections senden??? (https://www.delphipraxis.net/39391-string-alle-socket-connections-senden.html)

romber 2. Feb 2005 03:31


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

Stevie 2. Feb 2005 07:04

Re: String an alle Socket-Connections senden???
 
Zitat:

Zitat von Stevie
Außerdem verfügt ein Socket über eine Property, die Data heißt.
Dies ist ein Pointer. Dort kannst du ein beliebiges Objekt anhängen,
zum Beispiel die Anmeldedaten deines Clients, die er beim Connecten
übersenden muss. Wenn du an einen bestimmten Client etwas senden willst,
dann suchst du in deiner Socket-Liste nach dem richtigen Element.

SuchObjekt ist jetzt das Objekt, welches an dem Socket hängt, welchem du etwas schicken willst.
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:
for i:=0 to Pred(BenutzerListe.Count) do
  if TBenutzer(BenutzerListe[i]).Nickname = 'Stevie' then
    TBenutzer(BenutzerListe[i]).Socket.SendText('Hallo Stevie!');
Dazu musst du beim Anmelden des Benutzers ein TBenutzer-Objekt anlegen, es in die Liste
einfügen und die Eigenschaften setzen. Beim Abmelden muss es aus der Liste wieder entfernt werden.

romber 2. Feb 2005 10:15

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:
...
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

Stevie 2. Feb 2005 10:19

Re: String an alle Socket-Connections senden???
 
Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  SocketList.Add(Socket);
end;

romber 2. Feb 2005 10:41

Re: String an alle Socket-Connections senden???
 
Und was ist dann diese SocketList? :freak:

Stevie 2. Feb 2005 10:46

Re: String an alle Socket-Connections senden???
 
Ein stinknormales TList-Object! ;-)

romber 2. Feb 2005 10:54

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?

Stevie 2. Feb 2005 10:58

Re: String an alle Socket-Connections senden???
 
Delphi-Referenz durchsuchenTCustomWinSocket.SendText

romber 2. Feb 2005 11:09

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:
TCustomWinSocket(hier den SocketHandle).SendText(blablabla)
wird sicher nicht funktionieren, oder?

Stevie 2. Feb 2005 11:42

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.
Seite 1 von 2  1 2      

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