![]() |
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:?::?::?: |
AW: Server UserListe abfragen
Definiere "Server".
|
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. |
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...
|
AW: Server UserListe abfragen
SocketServer
|
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.... :-) |
AW: Server UserListe abfragen
Beeindruckende Glaskugel, Lemmy, roll mal rüber, dann kann ich auch was drin sehen.
|
AW: Server UserListe abfragen
Zitat:
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. |
AW: Server UserListe abfragen
Zitat:
|
AW: Server UserListe abfragen
Zitat:
|
AW: Server UserListe abfragen
ok dann versuche ich mal etwas ausführlicher zu werden :P
Delphi-Quellcode:
Das ist mein Server.
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. 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 |
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 |
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?
|
AW: Server UserListe abfragen
Okay der Ansatz hört sich ja gut an und wie mache ich das?:?:
|
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:
(rein beispielhaft).
Userlist:Fritz#Hans#August#Grete#Isolde#Adolar
|
AW: Server UserListe abfragen
:?::?:
|
AW: Server UserListe abfragen
Genauso wie die Benutzernachtichten zu den Clients kommen, kannst du auch die Benutzerliste da hinsenden.
|
AW: Server UserListe abfragen
schon klar aber woher bekomme ich diese Liste ?
|
AW: Server UserListe abfragen
Indem Du sie erstellst?
z.B. so:
Delphi-Quellcode:
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.
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; Für mich etwas zu viel Konjunktiv. ruß K-H |
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;
|
AW: Server UserListe abfragen
Zitat:
Bei Indy gibt es LockList/Un Methoden, damit man auf die Connections threadsicher zugreifen kann ( ![]() Gibt es so etwas auch für diese TCP Serverkomponente? |
AW: Server UserListe abfragen
|
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? |
AW: Server UserListe abfragen
Also ehrlich gesagt bin ich ziemlich überfragt ich bin ein Neuling in Delphi oder allgemein in der Programmierung.
|
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. |
AW: Server UserListe abfragen
Zitat:
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 |
AW: Server UserListe abfragen
Zitat:
Welche Delphi-Version setzt du denn ein (kann man aus deinem Profil ja leider nicht ersehen)? |
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? |
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. |
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 :) |
AW: Server UserListe abfragen
Zitat:
Gibt es eine "Ich lern das gerade" Version von Delphi? 4.159,00 ist mir zum "testen" zu viel :( |
AW: Server UserListe abfragen
Zitat:
![]() ![]() |
AW: Server UserListe abfragen
Zitat:
|
AW: Server UserListe abfragen
Da du
Delphi-Quellcode:
und
record
Delphi-Quellcode:
kennst, liegt die Antwort doch auf der Hand.
class
Erstelle dir einen
Delphi-Quellcode:
oder eine
record
Delphi-Quellcode:
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.
class
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; |
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 20:36 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