AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Chat mit PM

Ein Thema von hans ditter · begonnen am 3. Okt 2010 · letzter Beitrag vom 10. Okt 2010
Antwort Antwort
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: Chat mit PM

  Alt 4. Okt 2010, 20:30
Dafür hab ich ein sehr gutes/verständliches Tutorial namens "Terminatorzeichen-Protokoll-Tutorial" von Narses gelesen.
Könntest du mal einen Link dazu geben? Ich hab auch schon ein Tut mit diesem Namen gefunden.
Allerdings war diese bei www.delphi-library.de(um genau zu sein, hier http://www.delphi-library.de/topic_T...s_54269,0.html), und da konnte ich zwar sehen, dass die Person dieses Tut woh online gestellt hat, konnte aber die PDF, die das Tutorial offensichtlich beinhaltet, nicht herunterladen. Thx!

@all: Ok, ich denke, ich werde PMs über den Server laufen lassen. Da ich aber gerade erst mit Sockets angefangen habe, kann ich mir noch nicht wirklich vorstellen, wie die Zuordnung Nachricht -> Empfänger funktionieren soll.
Ich habe im Moment eine Listbox, die alle IPs der angemeldeten Clienten in chronologischer Reihenfolge (Anmeldereinfolge) beinhaltet.
Wenn ich jetzt z.B. die Idee von Sir Rufo aufgreifen, PMs über '@192.168.2.10' anzufangen, wie muss ich das Serverprogramm dann schreiben, dass der mir aus der Liste mit den IPs die richtige Connection sucht?
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Chat mit PM

  Alt 4. Okt 2010, 21:43
Das meinte ich mit dem Eintragen des dazugehörigen Sockets in die IP Liste. Sagen wir mal ein Client verbindet sich. Dann trägst du diesen mit ListBox1.Items.Add(IP); in die Liste ein.

Besser wäre es später statt einer ListBox z.b. eine TList mit einem Record zu verwenden, der sowohl IP, als auch den Socket Pointer speichern kann. Als Workaround könntest du dir allerdings parallel zur ersten ListBox eine Zweite anlegen, die beim Verbinden mittels ListBox2.Items.Add(IntToStr(Cardinal(Socket))); das Socket speichert.

Später suchst du dann in deiner ListBox1 nach der IP und findest diese z.B. an Index 2. Jetzt benutzt du TCustomWinSocket(StrToInt(ListBox2.Items[2])).SendText(NACHRICHT); zum Verschicken der privaten Nachricht an den richtigen Clienten.

Die Variante mit den zwei ListBoxen ist alles andere als schön und wie gesagt eher ein Workaround. Würde dir allerdings dringend raten das ganze auf TList unzuschreiben.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Chat mit PM

  Alt 5. Okt 2010, 20:35
@Zacherl
Ok, ich kann dir soweit folgen, dass ich vom Client ein Record mit IP und Nachricht schicken sollte. Dass diese dann mit einer TList verglichen wird.
Aber mir ist nicht klar, wie ich ein Record sende. Wie gesagt, ich bin noch ganz frisch in der Materie.

Freue mich auf weitere Antworten,
hans ditter
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Chat mit PM

  Alt 5. Okt 2010, 21:03
hm... ok, ich hab grad mal versucht mich in die Materie "Pointer" einzulesen... hab ich ehrlich gesagt auch noch nie benutzt...
Könntest du, Zacherl, vlt mal einen Quelltext zu deinem Beitrag posten? Muss nichts besonderes sein, nur das ich das Prinzip mal sehen kann...
Das wär cool!

hans ditter
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Chat mit PM

  Alt 6. Okt 2010, 07:27
@Zacherl
Ok, ich kann dir soweit folgen, dass ich vom Client ein Record mit IP und Nachricht schicken sollte. Dass diese dann mit einer TList verglichen wird.
Aber mir ist nicht klar, wie ich ein Record sende. Wie gesagt, ich bin noch ganz frisch in der Materie.

Freue mich auf weitere Antworten,
hans ditter
Einen Rekord wirst du wohp schwer selbst versenden können. Stattdessen überlegst du dir ein Chat Protokoll.

Dabei gibt es verschiedene Verfahren. jabber beziehungsweise XMPP nutzen xml um Empfänger Text und alles andere zu definieren.

Ein Vorschlag der Recht einfach zu implementieren ist, ist das du den Empfänger direkt schreibst. Dann machst du ein Zeichen welches eindeutig zum Trennen geeignet ist. Zum Beispiel einen Umbruch. Dann schreib du den Text. Fertig. Vom Server dann kommt das so ähnlich, nur das ganz am Anfang der Absender geschrieben wird. Dadurch kannst sogenanntest spoofing verhindern. Also das sind jemand als jemand anderes ausgibt.

Aber da kannst du dir was selber überlegen.

Und zu deinen Pointe: Irgendwo musst du doch deine Sockets speichern. Und diese verknüpfst du mit einen Namen und einer IP dazu empfehle ich, wenn man noch nicht Su gut mit Pointern umgehen kann, dass du einfach nehmen Klasse erstellst und darin die IP, Namen und zugehörige Verbindung speichert. Diese speicherst du dann in einer TObjectList.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Chat mit PM

  Alt 6. Okt 2010, 17:13
erstmal vielen Dank für deine Antwort xZise. Ich würde aber gerne das gleich "korrekt" lösen. Wenn ich Zacherl richtig verstanden hab, dann wäre dein Vorschlag auch keine "saubere" Lösung...
Wenn man Pointer etc. aber nicht so einfach erklären kann, dann probier ich erstmal deine Variante aus.

Eine Frage hätte ich aber noch. Dieses eindeutige Zeichen wird in ein Terminator-Zeichen-Protokoll verwendet, ist das korrekt? Und wie kann ich mir so ein Protokoll vorstellen? Ist das eine Unit mit verschiedenen Befehlen, die überprüft werden können?

hans ditter
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Chat mit PM

  Alt 6. Okt 2010, 18:07
Ok, ich hab mich grad nochmal mit meinem diiiicken Delphibuch auseinandergesetzt und glaube verstanden zu haben, wie ich das mit den Pointer und der TList hinbekomme.
Aber mir ist gleich das nächste Problem unter die Finger gekommen: Wo bekomme ich den Socket Pointer her?

Hoffe auf schnelle Antwort!!
hans ditter
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Chat mit PM

  Alt 6. Okt 2010, 18:09
Moin,
Also meine Lösung ist nur eine einfachere als die von Zacherl. Weil du immer weißt womit du hantierst und nicht mit Pointern arbeitest.

Vielleicht habe ich das übersehen, aber womit überträgst du die Daten? Zum Beispiel wenn du IdTCP (oder IdUDP) nutzt dann hätte ich es so gespeichert:
Delphi-Quellcode:
type
  TClientConnection = class
  private
    FSocket : TIdTCP;
    FNickname : string;

    function GetIP : string; // Hier halt die Ip mithilfe des Sockets zurückgeben oder irgendwie anders :)
  public
    property Socket : TIdTCP read FSocket;
    property Nickname : string read FNickname write FNickname;
    property IP : string read GetIP;
  end;

  TClientList = class
  private
    FClients : TObjectList; // Im Konstruktor erstellen & im Destruktor freigeben.
  public
    procedure ClientConnect(Connection : TClientConnection);
    procedure ClientDisconnect(Connection : TClientConnection);
  end;
Und wie du dein Protokoll schreibst, musst du wie gesagt immer selber wissen. Meine Möglichkeit hat den Vorteil, dass du sie mit einer TStringList lesen/interpretieren kannst. So könnte zum Beispiel eine private Nachricht aussehen:
Code:
PRIVATE
hans ditter
Hallo hans ditter! Dies ist eine private Nachricht
PRIVATE als Kennzeichner, dass es eine PM ist, dann der Nickname und dann der Text. Die Nachricht bekommst du dann und musst dann nur noch folgendes machen (Pseudoquelltext):
Code:
Wenn Typ = PM dann:
  Suche in der Clientliste nach den Nickname
  Ist der Nickname vorhanden
    Schicke die PM an den Client (Empfänger)
  ansonsten
    Schicke eine Fehlermeldung an den Sender
Die könnte dann so aussehen:
Code:
PRIVATE-RECV
xZise
Hallo hans ditter! Dies ist eine private Nachricht
Und die Fehlermeldung z.B.:
Code:
PRIVATE-ERR
Benutzername "hans ditter" nicht im Netzwerk vorhanden!
Bei diesem System hat man den Nachteil, dass man viel Platz verschwendet, durch die Zeilenumbrüche und den sprechenden Befehlen (PRIVATE, PRIVATE-RECV und PRIVATE-ERR). Aber dafür kann jeder Administrator sehen, wenn was schief geht was schief geht (z.B. hat jemand PRIVAT statt PRIVATE stehen oder so ).
Ein anderes Format wäre im IRC Stil:
Code:
msg <Reciever> <Content>
Hier wäre der Trenner das Leerzeichen, aber wieder sprechende Befehle, und Nicknames mit Leerzeichen sind nicht möglich.

Ansonsten kannst du dir auch XMPP anschauen. Die nutzen XML, was natürlich noch mehr Platz verschwendet. Aber dadurch ist es sehr leicht zu sehen, was verschickt wird, und das Protokoll kann einfach erweitert werden.

[redbox]Irgendwo speicherst du doch, die verschiedenen Verbindungen oder?[/redbox]

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: Chat mit PM

  Alt 6. Okt 2010, 18:24
tja, also bis jetzt hab ich es nur geschafft, an alle eine Nachricht zu schicken.
Wenn sich ein Client mit dem Server verbindet, dann schreib ich in eine ListBox die IP des Clienten und ausgehen von der IP schreibe ich den Username in eine 2. ListBox.
Aber das Socket oder so speicher ich noch nicht.
Ich hab jetzt mal ein bisschen gebastelt, mit Pointern.
Delphi-Quellcode:
type
  PClientData = ^TClientData;
  TClientData = record
    UserNick: string;
    IP: string;
    SocketPointer: pointer;
  end;

...

var
  Form4: TForm4;
  UserList: TList;
  UserData: PClientData; //Pointer auf TClientData (Record)

implementation

...

New(UserData);//neuer Pointer auf TClientData
    UserData^.IP:=Socket.RemoteAddress;
    UserData^.SocketPointer:=Cardinal(Socket);
    UserData^.UserNick:=UserNick.Items.Strings[UserNick.Items.Count];
Das ist das, was ich bisher habe. Allerdings gibt mir Delphi natürlich beim SocketPointer eine Fehlermeldung, da wäre nochmal gut zu wissen, wohin der Pointer eig zeigen soll (also, wie bringe ich da eine Pointer auf das entsprechende Socket unter?).

Zu dem Protokoll muss ich sagen, dass ich gerade total auf der Leitung stehe...

[Edit]Was du damit meinst, wie ich die Daten übertrage, ist mir auch nicht ganz klar. Ich denke mal mit TCP/IP und einer ganz normalen TClientSocket bzw. TServerSocket... war es das was du meintest?[/Edit]
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!

Geändert von hans ditter ( 6. Okt 2010 um 18:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 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