AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Chat mit PM

Ein Thema von hans ditter · begonnen am 3. Okt 2010 · letzter Beitrag vom 10. Okt 2010
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
hans ditter

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

Chat mit PM

  Alt 3. Okt 2010, 23:17
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...
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

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

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.011 Beiträge
 
Delphi 12 Athens
 
#2

AW: Chat mit PM

  Alt 3. Okt 2010, 23:23
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 3. Okt 2010 um 23:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Chat mit PM

  Alt 4. Okt 2010, 00:47
Normale Nachricht an alle
Code:
Hallo ihr da!
Nachricht an B
Code:
@B Hallo Du da!
Alle Nachrichten werden über den Server gesendet.
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

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

AW: Chat mit PM

  Alt 4. Okt 2010, 09:17
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:
/message Hallo Welt
/private foo Hallo foo
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.

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:
// Antwort auf die Frage: „Wie kann ich ‚foo‘ eine private Nachricht schreiben?“
/message /private foo Hallo foo
Ü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.

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

Registriert seit: 27. Aug 2010
264 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Chat mit PM

  Alt 4. Okt 2010, 13:18
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Chat mit PM

  Alt 4. Okt 2010, 15:08
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.
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
 
#7

AW: Chat mit PM

  Alt 4. Okt 2010, 21: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
 
#8

AW: Chat mit PM

  Alt 4. Okt 2010, 22: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
 
#9

AW: Chat mit PM

  Alt 5. Okt 2010, 21: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
 
#10

AW: Chat mit PM

  Alt 5. Okt 2010, 22: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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:47 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