Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Server UserListe abfragen (https://www.delphipraxis.net/177595-server-userliste-abfragen.html)

Frage95 15. Nov 2013 08:08

Server UserListe abfragen
 
Hallo ich programmiere zurzeit einen "Chat".

Nun möchte ich die Userliste des Servers abfragen und in eine Listbox speichern.

Nur leider, weiß ich nicht, wie man diese Abfragt:?::?::?:

baumina 15. Nov 2013 08:10

AW: Server UserListe abfragen
 
Definiere "Server".

Frage95 15. Nov 2013 08:20

AW: Server UserListe abfragen
 
Wie meinst du das?

Ein Sever halt. Sobald sich ein Client mit dem Server verbindet wird dieser in eine Liste des Servers eingetragen und diese möchte ich abfragen um sie dann in einer Listbox zu speichern.

Lemmy 15. Nov 2013 08:28

AW: Server UserListe abfragen
 
dann schau halt in die Dokumentation des Servers nach wie du die Userliste abfragen kannst... Solange du nicht sagst um welchen Server es sich handelt kann dir niemand weiter helfen...

Frage95 15. Nov 2013 08:34

AW: Server UserListe abfragen
 
SocketServer

Lemmy 15. Nov 2013 08:48

AW: Server UserListe abfragen
 
beeindruckend...

ich gehe jetzt mal davon aus, dass heute einfach wieder nicht mein Tag ist...

Ich vermute jetzt mal, dass Du auch den Server selbst programmierst. Ich vermute weiterhin, dass Du die TClientSocket/TServerSocket Klassen verwendest. Dann wirst du vermutlich für die Anmeldung am Server irgend wie so was haben:

Delphi-Quellcode:
  client.Socket.SendText('IchBinDa');

dann musst Du halt ein


Delphi-Quellcode:
  client.Socket.SendText('WerIstNochDa');

an den Server schicken. Der Server muss dann bei 'WerIstNochDa' die Userliste zurückgeben. Wenn ich weiter vermute, dass Du für die Speicherung eine TStringList verwendest schickst Du halt deren Inhalt an den Client zurück.

Falls es das nicht war was du wissen wolltest, dann geh bitte in dich, ließ deine Frage nochmal durch und stell dann die richtige Frage.... :-)

baumina 15. Nov 2013 08:53

AW: Server UserListe abfragen
 
Beeindruckende Glaskugel, Lemmy, roll mal rüber, dann kann ich auch was drin sehen.

generic 15. Nov 2013 09:11

AW: Server UserListe abfragen
 
Zitat:

Zitat von Frage95 (Beitrag 1236027)
SocketServer

Es hilft niemanden, wenn du nur Bröckchen hinwirfst.
Wie verwaltest du deine Benutzer?
Melden die sich am Server an?`
Hast du vielleicht keine Benutzer sondern nur Verbindungen?

Codebeispiele könnten uns helfen dir zu helfen.

Lemmy 15. Nov 2013 09:21

AW: Server UserListe abfragen
 
Zitat:

Zitat von baumina (Beitrag 1236030)
Beeindruckende Glaskugel, Lemmy, roll mal rüber, dann kann ich auch was drin sehen.

was zahlst Du? Außerdem funktioniert die immer nur am Freitag, den 13.

baumina 15. Nov 2013 09:25

AW: Server UserListe abfragen
 
Zitat:

Zitat von Lemmy (Beitrag 1236035)
Zitat:

Zitat von baumina (Beitrag 1236030)
Beeindruckende Glaskugel, Lemmy, roll mal rüber, dann kann ich auch was drin sehen.

was zahlst Du? Außerdem funktioniert die immer nur am Freitag, den 13.

Ich geb meine schwarze Katze in Zahlung, die läuft auch garantiert auf jedem Server.

Frage95 15. Nov 2013 09:32

AW: Server UserListe abfragen
 
ok dann versuche ich mal etwas ausführlicher zu werden :P

Delphi-Quellcode:
uses MainformU;

procedure server;
begin
     frmServer.Port.Text := '55555';
     frmServer.Server.Port := strtoint (frmServer.Port.Text);
     frmServer.Server.Active := True;


end;

procedure TfrmServer.FormCreate(Sender: TObject);
begin
Port.Text := '55555';
end;

procedure TfrmServer.FormDestroy(Sender: TObject);
begin
Server.Active := False;
end;

procedure TfrmServer.ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1.Lines.Add('Status: Client ' + Socket.RemoteAddress + ' verbunden.');
Userzahl:=Userzahl +1;
User.Caption:='User: ' + IntToStr(Userzahl);

end;

procedure TfrmServer.ServerClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1.Lines.Add('Status: Client ' + Socket.RemoteAddress + ' getrennt.');
Userzahl:=Userzahl -1;
User.Caption:='User: ' + IntToStr(Userzahl);

end;

procedure TfrmServer.ServerClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
Memo1.Lines.Add('Status: Client ' + Socket.RemoteAddress + 'hat den Fehler: ' + inttostr(Errorcode));
Userzahl:=Userzahl -1;
User.Caption:='User: ' + IntToStr(Userzahl);
end;

procedure TfrmServer.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var i:integer;
Nachricht:AnsiString;
begin
Nachricht:=Socket.RemoteAddress + ': ' + Socket.ReceiveText;
Memo1.Lines.Add(Nachricht);

for i := 0 to Server.Socket.ActiveConnections -1 do
  Server.Socket.Connections[i].SendText(Nachricht);

end;

procedure TfrmServer.BtnAnhaltenClick(Sender: TObject);
begin
Server.Port := strtoint (Port.Text);
Server.Active := False;

BtnStarten.Enabled := True;
BtnAnhalten.Enabled := False;

Memo1.Lines.Add('Status: Server angehalten.');
end;

procedure TfrmServer.BtnClearClick(Sender: TObject);
begin
Memo1.Lines.Clear;
Memo1.Lines.Add('Server 1.0');
end;

procedure TfrmServer.BtnSendenClick(Sender: TObject);
var i:Integer;
begin
for i := 0 to Server.Socket.ActiveConnections -1 do
   Server.Socket.Connections[i].SendText('Nachricht vom Server: ' + EdSenden.Text);
  Memo1.Lines.Add('Nachricht vom Server: ' + EdSenden.Text);
end;

procedure TfrmServer.BtnStartenClick(Sender: TObject);
begin
Server.Port := strtoint (Port.Text);
Server.Active := True;

BtnStarten.Enabled := False;
BtnAnhalten.Enabled := True;

Memo1.Lines.Add('Status: Server gestartet.');
end;

end.
Das ist mein Server.

Dann habe ich eine Unit MainForm, in dieser Mainform befindet sich ein EditFeld, in diesem EditFeld können die Benutzer Ihren Nickname eingeben.
Nun möchte ich, wenn sich z.B. 20 Leute "einloggen" dass bei jedem diese 20 Namen in der ListBox, die sich auch auf dieser MainForm befindet angezeigt wird.

Nun möchte ich nur noch die ServerListe abfragen und diese dann in der ListBox speichern.:-D

p80286 15. Nov 2013 10:20

AW: Server UserListe abfragen
 
Also wenn das Dein Server ist, dann fehlt ihm zumindestens eine rudimentäre Benutzerverwaltung, sprich eine "ActiveUserList".
Sobald diese vorhanden ist, und natürlich gefüllt, kannst Du diese dann an die Clients schicken.
(daß da ein paar Variablendefinitionen fehlen, und das eine oder andere ein wenig obskur ist, lassen wir mal unter den Tisch fallen)

Gruß
K-H

DeddyH 15. Nov 2013 10:21

AW: Server UserListe abfragen
 
Wie ist denn folgender Ansatz: sobald sich ein neuer Client an- oder abmeldet, sendet der Server ein definiertes Kommando an die verbundenen Clients, welche dann ihre Userliste aktualisieren?

Frage95 15. Nov 2013 10:28

AW: Server UserListe abfragen
 
Okay der Ansatz hört sich ja gut an und wie mache ich das?:?:

DeddyH 15. Nov 2013 10:33

AW: Server UserListe abfragen
 
Na so, wie ich geschrieben habe. Die Ereignisse An- und Abmeldung benutzt Du ja bereits, und auch ein Senden des Servers habe ich im Code erkennen können. Was nun noch fehlt, ist das definierte Kommando sowohl auf Server- wie auch auf Clientseite, so etwas wie
Code:
Userlist:Fritz#Hans#August#Grete#Isolde#Adolar
(rein beispielhaft).

Frage95 15. Nov 2013 11:13

AW: Server UserListe abfragen
 
:?::?:

himitsu 15. Nov 2013 11:25

AW: Server UserListe abfragen
 
Genauso wie die Benutzernachtichten zu den Clients kommen, kannst du auch die Benutzerliste da hinsenden.

Frage95 15. Nov 2013 11:39

AW: Server UserListe abfragen
 
schon klar aber woher bekomme ich diese Liste ?

p80286 15. Nov 2013 11:57

AW: Server UserListe abfragen
 
Indem Du sie erstellst?
z.B. so:
Delphi-Quellcode:
Userlist: Tstringlist;

..
Userlist:=Tstringlist.create;

procedure TfrmServer.ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('Status: Client ' + Socket.RemoteAddress + ' verbunden.');
  Userzahl:=Userzahl +1; // woher auch immer das kommt!
  Userlist.Add(UserName); // woher auch immer das kommt!
  User.Caption:='User: ' + IntToStr(Userzahl);
end;

procedure TfrmServer.ServerClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
  uli : integer;
begin
  Memo1.Lines.Add('Status: Client ' + Socket.RemoteAddress + ' getrennt.');
  Userzahl:=Userzahl -1;
  uli:=userList.Indexof(UserName);    // woher auch immer das kommt!
  if uli>-1 then Userlist.delete(uli); // woher auch immer das kommt!
  User.Caption:='User: ' + IntToStr(Userzahl);
end;
So könnte man es machen, die Frage ist aber wo die Information UserName herkommt, ebenso scheint ja auch Userzal vom Himmelgefallen zu sein und User könnte ein Formular sein.
Für mich etwas zu viel Konjunktiv.

ruß
K-H

himitsu 15. Nov 2013 12:09

AW: Server UserListe abfragen
 
Man kann die Namen auch in den Benutzerdaten des Socket speichern.
Muß dann beim erstellen der Liste nur alles sockets auflisten und da den Namen auslesen.

Oder wenn es nur in der Userlist gespeichert wird,
dann macht es sich nicht schlecht da auch den zugehörigen Socket mit zu speichern, damit man eine Verbindung zwischen Socket und Benutzer hat.

PS:
Delphi-Quellcode:
Useranzahl := Userlist.Count;

mjustin 15. Nov 2013 14:46

AW: Server UserListe abfragen
 
Zitat:

Zitat von Frage95 (Beitrag 1236039)
Delphi-Quellcode:


for i := 0 to Server.Socket.ActiveConnections -1 do
  Server.Socket.Connections[i].SendText(Nachricht);
Das ist mein Server.

Das sieht nicht sehr threadsicher aus. Änderungen an ActiveConnections während des Schleifendurchlaufs können zu Access Violations oder anderen Problemen führen.

Bei Indy gibt es LockList/Un Methoden, damit man auf die Connections threadsicher zugreifen kann (http://stackoverflow.com/questions/5...y-tidtcpserver).

Gibt es so etwas auch für diese TCP Serverkomponente?

Jumpy 18. Nov 2013 08:04

AW: Server UserListe abfragen
 
Ich werf mal dieses Tutorial in den Raum:

http://www.entwickler-ecke.de/topic_...s_54269,0.html

generic 19. Nov 2013 09:21

AW: Server UserListe abfragen
 
^erst das Tutorial lesen!

Du musst dir wenn du einen Chat baust, etwas Gedanken über dein Protokoll und die Zustände der Verbindungen Gedanken machen.
Die eigentliche Verbindung/Connection ist ja nur der Transportkanal für Daten.

Vom Ablauf:
Der Client muss sich verbinden.
Der Server lässt die Verbindung zu und merkt sich (z.B. via statemachine) in welche Zustand die Verbindung ist. Das ist derzeit nicht angemeldet bzw. Gast.
Nun schickt der Client Benutzer und Passwort. Der Server prüft es bei Fehler wird der Client über die nicht erfolgreiche Anmeldung informiert. Ist es erfolgreich, dann muss der Zustand der Verbindung auf Angemeldet umgeschaltet werden und ggf. der Benutzername mit der Verbindung zusammen gespeichert werden.
Wenn das mehrere Clients machen, dann hast du deine Benutzerliste.

Wenn nun eine Chat-Nachricht kommt, dann muss diese weitergeleitet werden, wenn der Sender den angemeldeten Zustand hat. Die Weiterleitung an aller verbundenen Clients (so können Gäste mitlesen, aber nicht schreiben).

Wird eine Verbindung getrennt, dann muss der Benutzer aus der Benutzer-Verbindungsliste entfernt werden.

Persönliche Nachrichten lassen sich auch schreiben, in dem in der Nachricht ein Empfänger ist. Dann muss nur durch die Verbindungsliste gegangen werden und dann an jede (mehrere!) die dem Benutzer gehört, die Nachricht schicken.

Also wie soll dein Protokoll zur Steuerung (Anmelden, Abmelden, Persönliche Nachrichten, Nachrichten an Raum, Passwort-Ändern, Benutzer-Erstellen etc.) aussehen.
Wie soll eine Nachricht aussehen, denn diese ist ja auch nur ein Container, welcher durch den Datenkanal geschickt wird. Hat diese wie eine Email Absender/Empfänger oder wird das auf Protokoll-Ebene entschieden?
Wie überträgt man die Nachricht, dass dort enthalten Befehle nicht als Protokoll ausgewertet werden?

Frage95 20. Nov 2013 09:21

AW: Server UserListe abfragen
 
Also ehrlich gesagt bin ich ziemlich überfragt ich bin ein Neuling in Delphi oder allgemein in der Programmierung.

generic 20. Nov 2013 17:08

AW: Server UserListe abfragen
 
Das haben wir uns schon gedacht und wollten dezent drauf hinweisen, dass ein Chat nicht mal eben so programmiert ist.

Es wird dann halt immer interessant, wenn "einfache" Anforderungen wie "Benutzerliste" dazu kommen und die eigentliche Problematik dahinter nicht gesehen wird. Das geht dann auch nur mit Erfahrung.
Netzwerkzeug hat auch viel mit Sicherheit zu tun - unerfahrend besser die Finger von lassen.

Vielleicht ein einfaches "Start"-Projekt? Es gab hier mal in der DP ein Betrag mit Beispielprojekten.
Hat den mal bitte jemand zur Hand.

Wenn du es dennoch probieren willst, dann schau dir mal das POP3-Protokoll an. Das ist recht einfach und gibt dir vielleicht paar weitere Ideen.

Chat und Email sind sehr ähnlich.

ramboni 16. Mai 2014 23:55

AW: Server UserListe abfragen
 
Zitat:

Zitat von himitsu (Beitrag 1236086)
Man kann die Namen auch in den Benutzerdaten des Socket speichern.
Muß dann beim erstellen der Liste nur alles sockets auflisten und da den Namen auslesen.

Oder wenn es nur in der Userlist gespeichert wird,
dann macht es sich nicht schlecht da auch den zugehörigen Socket mit zu speichern, damit man eine Verbindung zwischen Socket und Benutzer hat.

PS:
Delphi-Quellcode:
Useranzahl := Userlist.Count;

Hi,

interessantes Thema. Ich versuche sowas auch gerade.
Wie kann ich denn den Socket mit in einer Stringlist speichern?
Wie sieht so ein gespeicherter Wert dann aus und wie kann ich danach
Suchen damit ich z.B. eine Nachricht nur an diesen User senden kann?

LG RamboNi

Sir Rufo 17. Mai 2014 00:02

AW: Server UserListe abfragen
 
Zitat:

Zitat von ramboni (Beitrag 1259114)
Wie kann ich denn den Socket mit in einer Stringlist speichern?

Sinnvoll ist es das erst gar nicht mit einer StringList speichern zu wollen.

Welche Delphi-Version setzt du denn ein (kann man aus deinem Profil ja leider nicht ersehen)?

ramboni 17. Mai 2014 01:44

AW: Server UserListe abfragen
 
Ich teste mich seit kurzem im Programmieren, habe aber leider
keine eigene Lizens also nutz ich den Rechner eines ehem. Kollegens dafür.
So genau weiß ich es aber nicht. XE irgendwas... reicht das vielleicht schon?

Wo/wie speicher ich die denn, wenn nicht in einer Stringlist?

Sir Rufo 17. Mai 2014 01:53

AW: Server UserListe abfragen
 
Im Profil trägt man nicht die Lizenz ein, sondern die Version mit der man hauptsächlich arbeitet.

Eine StringList ist primär zum Speichern/Verwalten von Text (eine Liste mit Strings).
Passt ja nicht so wirklich, wenn man Benutzer und Socket (und ...) verwalten möchte.
Geht irgendwie schon, aber man ist fast nur am hin- und herwandeln (string <-> echte Information).

Records und Klassen kennst du schon?

Wenn nicht, dann solltest du auf jeden Fall zunächst ein paar Grundlagen-Tutorials durcharbeiten.

ramboni 17. Mai 2014 02:02

AW: Server UserListe abfragen
 
Records und Klassen sagen mir etwas ja.

Allerdings bin ich jetzt noch mehr verwirrt :)
Sind Records meine "SocketSammler", bei z.B. 5 Usern?

Das Stringlistverfahren hab ich mittlerweile verstanden, da kann man einen
String und ein Socket speichern nur sieht man den Socket halt einfach nicht :)

ramboni 17. Mai 2014 02:08

AW: Server UserListe abfragen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1259120)
Im Profil trägt man nicht die Lizenz ein, sondern die Version mit der man hauptsächlich arbeitet.

Gemacht.

Gibt es eine "Ich lern das gerade" Version von Delphi?
4.159,00 ist mir zum "testen" zu viel :(

Perlsau 17. Mai 2014 07:26

AW: Server UserListe abfragen
 
Zitat:

Zitat von ramboni (Beitrag 1259122)
Gibt es eine "Ich lern das gerade" Version von Delphi? 4.159,00 ist mir zum "testen" zu viel :(

Wie wär's mit Lazarus oder CodeTyphon: Ideal, wenn man kein Geld hat. Und ganz ohne irgendwelche Einschränkungen, man kann sogar Multiplattform-Applikationen entwickeln.

ramboni 17. Mai 2014 12:08

AW: Server UserListe abfragen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1259120)
Im Profil trägt man nicht die Lizenz ein, sondern die Version mit der man hauptsächlich arbeitet.

Eine StringList ist primär zum Speichern/Verwalten von Text (eine Liste mit Strings).
Passt ja nicht so wirklich, wenn man Benutzer und Socket (und ...) verwalten möchte.

Was paßt denn besser?

Sir Rufo 17. Mai 2014 12:20

AW: Server UserListe abfragen
 
Da du
Delphi-Quellcode:
record
und
Delphi-Quellcode:
class
kennst, liegt die Antwort doch auf der Hand.

Erstelle dir einen
Delphi-Quellcode:
record
oder eine
Delphi-Quellcode:
class
um die benötigten Informationen zu speichern, so wie du sie hast oder benötigst. Die einzelnen Elemente kannst du dann in einer Liste verwalten.

Kleines minimalistisches Beispiel:
Delphi-Quellcode:
type
  TUser = class
  public
    property Name : string;
  end;

  TActiveUser = class
  public
    property User : TUser;
    property Sessions : TList<TSession>;
  end;

  TActiveUserList = class( TList<TActiveUser> )
  public
    // Angemeldete Benutzer mit Anzahl der Sessions
    procedure GetUsers( AUsers : TStrings );
  end;

procedure TActiveUserList.GetUsers( AUsers : TStrings );
var
  LUser : TActiveUser;
begin
  AUsers.BeginUpdate;
  try
    AUsers.Clear;
    for LUser in Self do
      AUsers.Add( Format( '%s (%d)', [ LUser.User.Name, LUser.Sessions.Count ] ) );
  finally
    AUsers.EndUpdate;
  end;
end;

ramboni 17. Mai 2014 12:36

AW: Server UserListe abfragen
 
Ich habe noch nie mit Sockets gearbeitet.
Ich weiß überhaupt nicht wie ich da jetzt ran gehen soll :(

Wie sieht denn ein Socket aus, nach was muss ich dann suchen wenn z.B.
Socket1-5 connectet und ich den 3 haben will? Ist ein Socket eine Zahl oder String?

In dem verlinktem Tut wird das mit einer Listbox gemacht, aber auch da seh ich den Socket nicht.
Clients.Items.Strings[ClientIndex] := Data.Strings[1];


Ist es möglich ein Code Beispiel zu bekommen?

//Edit: Oh da ist ja Code, war der eben auch schon da? :o)


//Edit2: Was dafon ist der/das Socket?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz