Delphi-PRAXiS
Seite 4 von 4   « Erste     234

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Chat mit PM (https://www.delphipraxis.net/154972-chat-mit-pm.html)

xZise 9. Okt 2010 00:56

AW: Chat mit PM
 
Das ist im Grunde genommen diese Liste. Ich sagte auch "am besten ginge es ...", aber da müsste ich noch mehr erklären und man müsste sich das erst downloaden/zusammensuchen.

Ich würde dir empfehlen: Du speicherst in einer Liste zu welcher Connection, welcher Benutzername gehört. Das heißt erstmal findest du heraus, welcher Datentyp .Connections[ idx ] ist. Und dann machst du das entweder mit Records oder mit Klassen und speicherst zu jeder Verbindung, welcher Benutzername dazu gehört.

Das speicherst du in die Liste und die dir unbekannte Methode geht dann einfach die Liste durch und sucht den Benutzername.
So ungefähr könnte man das machen:
Delphi-Quellcode:
type
  PElement = ^TElement;
  TElement = record
    Nick : string;
    Connection : TConnection; // Den Datentyp von oben! Ich weiß es gerade nicht, also einfach mal gucken!
  end;

  TConnections = class(TObject)
  private
    FConnections : TList; // Im Konstruktor erstellen/Destruktor freigeben
  public
    procedure AddConnection(Nick : string; Connection : TConnection);
    procedure RemoveConnection(Nick : string);
    function GetUserFromSocket(Connection : TConnection) : string; // Das ist einfach durchgehen und testen
  end;


procedure TConnections.AddConnection(Nick : string; Connection : TConnection);
var
  e : PElement;
begin
  New(e);
  e.Nick := Nick;
  e.Connection := Connection;
  FConnections.Add(e);
end;

procedure TConnections.RemoveConnection(Nick : string);
var
  e : PElement;
begin
  // Nick suchen
  for i := 0 to FConnections.Count - 1 do
  begin
    e := PElement(FConnections[i]);
    if (e.Nick = Nick) then
    begin
      FConnections.Delete(i);
      Dispose(e);
      Exit;
    end;
  end;
end;
Alle Angaben ohne Gewähr!

MfG
Fabian

PS: Die Dictionary wäre halt schneller, aber so gehts auch erstmal.

Sir Rufo 9. Okt 2010 02:04

AW: Chat mit PM
 
Zitat:

Zitat von hans ditter (Beitrag 1054629)
Ok, cool!! Ich hab das aber mit dem User herausfinden noch nicht ganz gerafft.
Mein Delphi kennt beim Server die Funktion
Delphi-Quellcode:
GetUserFromSocket
nicht. Was mache ich falsch bzw. wie komme ich dann an die Verbindung ran?

Wie xZise schreibt, die musst du selber erstellen ... ich bin aber (nach dem was du hier geschrieben hast) davon ausgegangen, dass du schon so eine Liste führst (User,Socket). Die Funktion sucht dann aus der Liste den Socket und liefert den User.

Zitat:

Zitat von hans ditter (Beitrag 1054629)
Auch finde ich im Moment "TServerWinSocket" nicht ... ich habe die ganze Weiterleitung etc. in OnClientRead (ist das korrekt?), da gibt es aber nur
Delphi-Quellcode:
...ClientRead(Sender: TObjet; Socket: T[B]Custom[/B]WinSocket);
.
Und:
Delphi-Quellcode:
 ( Socket <> TServerWinSocket( Sender ).Connections[ idx ] ) then
--> ist Socket nicht gleich TServerWinSocket??

Du hast doch eine TServerSocket-Komponente auf deiner Form liegen. Ich weiß nicht wie die heißt ... ist aber auch egal.
Nehmen wir mal an, die heißt ServerSocket1, dann hätte ich auch schreiben können
Delphi-Quellcode:
ServerSocket1.Connections[ idx ]
aber sowas ist immer doof, denn wenn du die Komponente umbenennst, dann funktioniert dein Code nicht mehr.
In dem Parameter Sender habe ich den Verweis auf die Komponente die diese Methode aufruft, und das ist deine TServerSocket (wie immer die auch heißen mag). Durch die Vererbung (OOP) brauche ich die Sicht auf TServerWinSocket (davon ist TServerSocket abgeleitet), denn ab da kann ich auf die Connections zugreifen.
Sender ist aber erst mal vom Typ TObject (siehst du an der Definition der Methode
Delphi-Quellcode:
procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
). Darum benötige ich/du einen TypeCast und den macht man mit
Delphi-Quellcode:
TServerWinSocket( Sender )
. Jetzt kannst du deine Komponente auch in
Delphi-Quellcode:
RudiRüsselSeineSocketKomponente
umbenennen und es (diese Methode) wird immer noch funktionieren (in D2010 kann man auch ein ü im Namen haben).

Ich hätte auch
Delphi-Quellcode:
TServerSocket( Sender )
nehmen können, es ist aber besser immer die niedrigste benötigte Ableitung im TypeCast zu verwenden. Das wirst du merken, wenn du mal etwas mehr mit OOP arbeitest ;)

Soweit zum TypeCast

Delphi-Quellcode:
( Socket <> TServerWinSocket( Sender ).Connections[ idx ] )
Hier die Bedeutung der einzelnen Elemente:

Delphi-Quellcode:
Socket
-> Verbindung zum Client, von dem aktuell die Nachricht empfangen wird
Delphi-Quellcode:
TServerWinSocket( Sender ).Connections
-> Liste mit allen Verbindungen zum Server
Delphi-Quellcode:
TServerWinSocket( Sender ).Connections[ idx ]
-> Verbindung zu einem Client

Innerhalb der for-Schleife (idx) prüfe ich, ob die Verbindung[ idx ] = der Verbindung des Clients ist von dem aktuell die Nachricht empfangen wird, weil dem will ich die Nachricht ja nicht mehr schicken.
Der bekommt im Anschluss zwar auch eine Nachricht, aber mit einer anderen Intention.

xZise 9. Okt 2010 10:33

AW: Chat mit PM
 
Moin,
könnte er sich dann nicht den Cast sparen und einfach den zweiten Parameter verwenden?

MfG
Fabian

Sir Rufo 9. Okt 2010 10:42

AW: Chat mit PM
 
Zitat:

Zitat von xZise (Beitrag 1054644)
Moin,
könnte er sich dann nicht den Cast sparen und einfach den zweiten Parameter verwenden?

MfG
Fabian

Nein (ok ich hatte mich im letzten teil vertippt, hab es aber jetzt korrigiert), denn ich brauche ja den Zugriff auf den ServerSocket um alle anderen Verbindungen (Sockets) zu erfahren

xZise 9. Okt 2010 11:45

AW: Chat mit PM
 
Achso, und der zweite Parameter gibt den "Quellsocket" an, also wo das Paket hergekommen ist? Dann hab ich nichts gesagt :stupid: Hab halt nicht so viel damit zu tun.

MfG
Fabian

hans ditter 10. Okt 2010 00:12

AW: Chat mit PM
 
Ok, das hört sich doch alles sehr gut an!! :-D Könntet ihr mir aber nochmal auf die Sprünge helfen, wie ich herausbekomme, welcher Datentyp
Delphi-Quellcode:
.Connections[idx]
ist?
Eine generelle Frag zu Pointer hab ich nochmal:
Ich weise einen Wert zu:
Delphi-Quellcode:
New(Pointer);
Pointer^.A:='A';
Ich lese den Wert eines Pointer aus:
Delphi-Quellcode:
PointerString:=Format(%p,'Pointer^.A');
Ist das richtig? Denke, da muss ich noch was dran korrigieren...

Vielen Dank für eure große Hilfe,
hans ditter

[edit]Muss ich eigentlich eine Record und eine Klasse verwenden? [/edit]

Sir Rufo 10. Okt 2010 03:20

AW: Chat mit PM
 
Frage die Online-Hile oder die Delphi-Reference

Pro Thread nur eine Frage, du kannst aber auch die SuFu hier im Forum benutzen

Allerdings, wofür einen Pointer? In der Objekt-Variable ist eh nur die Referenz auf den Speicherbereich hinterlegt - ist also quasi ein Pointer.

Und dann noch die Umwandlung in einen String ... Merk dir doch einfach die Objekt-Referenz

Du solltest unbedingt einige Grundlagen-Tutorials durcharbeiten.
Tutorials findet man über die SuFu oder google oder ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 Uhr.
Seite 4 von 4   « Erste     234

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