![]() |
Chat mit PM
Ich habe nun schon einige Zeit gesucht, viel Tuts gefunden, aber keine Antwort auf meine Frage.
Ich habe mir ein Chatprogramm geschrieben, welches auch schon funktioniert. Man kann eine Nachricht schreiben und sie wird an alle gesendet. Doch da ist meine Frage: Wie schaffe ich es, nur an einen bestimmten Clienten zu senden? Beispiel: Im Chat angemeldet sind A,B,C. A möchte B eine private Nachricht schicken, sodass C nichts davon mitbekommt. Ich hatte mir gedacht möglicherweise im Server eine Liste mit allen aktiven, angemeldeten Clients zu erstellen. Der Client schickt dann statt nur einem Text ein Record, welches den Text, der gesendet werden soll, und den User, der die Nachricht empfangen soll, enthält. Aber ob das eine elegante Lösung ist, wage ich mal zu bezweifeln. Falls jemand ein Tutorial oder ein bereits vorhandes Thema kennt, das auf dieses Problem eingeht, dass bitte posten! Habe persönlich aber nichts passendes gefunden. Großer Dank, hans ditter p.s.: und gute Nacht... ;) |
AW: Chat mit PM
Wenn man erlaubt, daß jeder die IPs der anderen Chatter erfahren darf, dann
> Client fragt Server nach IP des gewünschten User, verbindet sich mit diesem Clienten und sendet direkt die gewünschte Nachricht ansonsten, wie du es schon erkannt hast, bleibt nur der Weg über den Server > es wird eine Nachricht an den Server geschickt, mit der Bitte diese nur an den gewünschten User zu schicken Wie man es nun genau machen kann, das hängt von deinem Chatprogramm+Serveranwendung ab. Aber letztendlich sollte es dir doch kein Problem darstellen, da du ja deine Anwendungen kennst, dieses entsprechend zu implementieren. Man bedenke aber auch die beiden gegenstätzlichen Sicherheitsaspekte, - wenn nicht jeder jeden direkt "kennt" (der Weg den über Server) - wenn der Server nicht mitlesen kann (der direkte Weg) |
AW: Chat mit PM
Normale Nachricht an alle
Code:
Nachricht an B
Hallo ihr da!
Code:
Alle Nachrichten werden über den Server gesendet.
@B Hallo Du da!
Fängt die Nachricht mit @ an, dann folgt darauf der Empfänger und dann die Nachricht. Dieses wertet der Server aus und verschickt die Nachricht dann nur an B und nicht wie sonst an alle Welches Zeichen du dafür nimmst, ob dort auch mehrere Empfänger stehen können, etc. Legst du fest und ist dann Bestandteil von deinem Chat-Protokoll |
AW: Chat mit PM
Oder mach es so ähnlich wie bei IRC. Du definierst bestimmte befehle wie „Channel Nachricht“ und „Private Nachricht“ und sagst wie man die eingeben kann. Zum Beispiel so:
Code:
Erstes sendet es an alle, zweites sendet es nur an die Person. Wenn jemand jetzt in die Chatzeile nur „Hallo Welt“ eingibt, dann fügt der Client automatisch das „/message“ an.
/message Hallo Welt
/private foo Hallo foo Das hat den Vorteil, dass man selber auch eine Nachricht verschicken kann um den anderen zu erklären wie man eine private Nachricht schickt:
Code:
Übrigens ist das normalerweise der Weg der privaten Kommunikation: Zumindest ist es bei IRC, Jabber und ICQ nicht anders. Dort werden i.d.R. alle Nachrichten an den Server geschickt. Das hat auch den Vorteil, dass man keine großen Probleme durch Router o.ä. hat.
// Antwort auf die Frage: „Wie kann ich ‚foo‘ eine private Nachricht schreiben?“
/message /private foo Hallo foo MfG Fabian |
AW: Chat mit PM
Ich habe vor kurzem auch einen Chat programmiert.
Dafür hab ich ein sehr gutes/verständliches Tutorial namens "Terminatorzeichen-Protokoll-Tutorial" von Narses gelesen. Wodrin unter anderem auch die Whisper Funktion erläutert wird. Dort geht es auch noch weiter bis zur Dateiübertragung ;) |
AW: Chat mit PM
Ich hatte es in meinem Chat immer so, dass alle Nachrichten über den Server laufen. Der Server hatte logischerweise auch eine Liste mit den Namen aller verbundener Clienten. Anhand dieser konnte bei privaten Nachrichten die IP und das entsprechende Socket herausgefunden werden, an das die Nachricht gesendet werden soll.
Beim Anlegen der Liste ist es sinnvoll einen Pointer auf das entsprechende Socket direkt nach der Authentifizierung zusätzlich im List Struct zu speichern. Das vereinfacht den Zugriff auf die einzelnen Verbindungen enorm. |
AW: Chat mit PM
Zitat:
Allerdings war diese bei ![]() ![]() @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? |
AW: Chat mit PM
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
Delphi-Quellcode:
in die Liste ein.
ListBox1.Items.Add(IP);
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
Delphi-Quellcode:
das Socket speichert.
ListBox2.Items.Add(IntToStr(Cardinal(Socket)));
Später suchst du dann in deiner ListBox1 nach der IP und findest diese z.B. an Index 2. Jetzt benutzt du
Delphi-Quellcode:
zum Verschicken der privaten Nachricht an den richtigen Clienten.
TCustomWinSocket(StrToInt(ListBox2.Items[2])).SendText(NACHRICHT);
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. |
AW: Chat mit PM
@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 |
AW: Chat mit PM
hm... ok, ich hab grad mal versucht mich in die Materie "Pointer" einzulesen... hab ich ehrlich gesagt auch noch nie benutzt... :oops::oops:
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 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 by Thomas Breitkreuz