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
Benutzerbild von xZise
xZise

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

AW: Chat mit PM

  Alt 6. Okt 2010, 21:34
Moin,
[...]Hm, wenn ich das richtig verstanden hab mit dem Cardinal(Socket): Socket ist die Variable bei ServerSocketClientConnect(Socket: TCustomWinSocket);[...]
Dann schreib doch statt "Pointer" einfach "TCustomWinSocket".

[...]Oh man, ich trau gar nicht, dass zu sagen, aber ich hab's immer noch nicht verstanden mit dem Protokoll. So wie ich mir vorstelle, läuft das so, dass User A /msg to B {content} schreibt und das an den Server schickt.
Der Server empfängt etwas, überprüft, ob am Anfang etwas steht (hier ja: /msg to B) versteht: "aha, /msg to bedeutet, dass soll eine private Nachricht sein", überprüft dann den angegebenen User, ob der angemeldet ist und schickt die Nachricht an ihn.
Ist meine Vorstellung davon überhaupt korrekt?? Ich fürchte fast nein...
Genau so! Du überlegst halt einfach, was du übertragen musst: Zum Beispiel "Schicke an alle" und "Schicke an benutzer". Das heißt du musst übertragen, welcher Typ das ist, damit der Server und die anderen Clients wissen, was für eine Nachricht war das. Dann musst du einen Empfänger definieren, wenn es eine private Nachricht ist. Und zum Schluss musst du dann noch den Inhalt dazu schreiben.

Der Server liest nun die Nachricht und entschlüsselt den Typ um heraus zu finden, was er damit machen soll und handelt dann entsprechend. Zum Beispiel wenn man eine private Nachricht verschicken will, das habe ich ja schon beschrieben.

So könntest du zum Beispiel einen Befehl definieren, um den Nickname eines Benutzers zu ändern und weitere Befehle definieren.

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
 
#2

AW: Chat mit PM

  Alt 7. Okt 2010, 17:32
Hey, dann war das ja doch gar nicht so falsch!! *FREU* Ich hatte das so schonmal versucht. Ich wollte /msg B Hallo B schicken. Das würde ja aber bedeuten, dass ich irgendwie erstmal das /msg rauskopieren und vergleichen und dann den User rauskopieren und vergleichen muss.
Geht das nicht einfacher?
Also vlt nach dem Motte: Wenn der Server einen String empfängt, der mit / anfängt, dass er dann weiß: "Ok, ich muss jetzt mal schauen welcher Befehlt da steht". Wenn er dann sieht, der Befehl ist msg, dass er dann automatisch nach dem User schaut. (Vielleicht könnte man das Ende des Befehls ja mit einem weiteren / markieren?)

Zu Pointer etc:
Ich hab von pointer schon auf TCustomWinSocket umgestellt. Wollte dann mit UserData^.SocketPointer:=Socket; dauf Socket einen Pointer speichern, wenn ich den Inhalt des Pointers dann aber ausgeben wollte, kam nichts raus...
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
 
#3

AW: Chat mit PM

  Alt 7. Okt 2010, 17:55
Deine "Vereinfachung" ist doch keine Vereinfachung. Wenn du sagst das die Befehle kein Leerzeichen haben, dann machst du einfach:
Delphi-Quellcode:
var
  command : string;
begin
  command := Copy(input, 1, Pos(' ', input) - 1);
Dann hast du schon mal den Befehl und den Nick bekommst du ähnlich einfach:
Delphi-Quellcode:
var
  command : string;
  reciever : string;
  message : string

  delimToCommand : Integer;
  delimToReciever : Integer;
begin
  delimToCommand := Pos(' ', input); // Dort ist das erste Leerzeichen
  delimToReciever := PosEx(' ', input, delimToCommand + 1); // Da das zweite
  command := Copy(input, 1, delimToCommand - 1);
  reciever := Copy(input, delimToCommand + 1, delimToReciever - delimToCommand - 1);
  message := Copy(input, delimToReciever, Length(input) - delimToReciever);
Man könnte auch Delphi-Referenz durchsuchenExplode verwenden, aber das könnte zu übereifrig werden, wenn weitere Leerzeichen kommen.

Übrigens habe ich deshalb auch vorgeschlagen mehrere Zeilen zu nehmen. Dann hättest du einfach machen können:
Delphi-Quellcode:
var
  msg : TStrings;

  command : string;
  reciever : string;
  message : string
begin
  msg := TStringList.Create;
  try
    msg.Text := input;
    command := msg[0];
    msg.Delete(0);
    reciever := msg[0];
    msg.Delete(0);
    message := msg.Text;
  finally
    msg.Free;
  end;
Vielleicht geht das auch schöner ohne die Zeilen zu löschen.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  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
 
#4

AW: Chat mit PM

  Alt 7. Okt 2010, 18:12
Übrigens habe ich deshalb auch vorgeschlagen mehrere Zeilen zu nehmen. Dann hättest du einfach machen können:
Delphi-Quellcode:
var
  msg : TStrings;

  command : string;
  reciever : string;
  message : string
begin
  msg := TStringList.Create;
  try
    msg.Text := input;
    command := msg[0];
    msg.Delete(0);
    reciever := msg[0];
    msg.Delete(0);
    message := msg.Text;
  finally
    msg.Free;
  end;
Vielleicht geht das auch schöner ohne die Zeilen zu löschen.

MfG
Fabian
Wieso macht ihr euch das Leben immer so schwer?
Das ist z.B. die Nachricht
Code:
CMD=MSG
SEN=Walter
REC=Peter
MSG=Alles frisch im Schritt
Diese wird wie folgt erstellt:
Delphi-Quellcode:
function BuildMessage( const Sen, Rec, Msg : string ) : string;
begin
  with TStringList.Create do
    try
      Values[ 'CMD' ] := 'MSG';
      Values[ 'SEN' ] := Sen;
      Values[ 'REC' ] := Rec;
      Values[ 'MSG' ] := Msg;
      Result := Text;
    finally
      Free;
    end;
end;
Auslesen des CMDs geht so
Delphi-Quellcode:
function ReadMessageCmd( const RecvTxt : string ) : string;
begin
  with TStringList.Create do
    try
      Text := RecvTxt;
      Result := Values[ 'CMD' ];
    finally
      Free;
    end;
end;
Und auslesen der Nachricht geht dann so
Delphi-Quellcode:
procedure ReadMessage( const RecvTxt : string; var Sen, Rec, Msg : string );
begin
  with TStringList.Create do
    try
      Text := RecvTxt;
      Sen := Values[ 'SEN' ];
      Rec := Values[ 'REC' ];
      Msg := Values[ 'MSG' ];
    finally
      Free;
    end;
end;
Und nochmal bemerkt, mit JSON geht das ganze super stressfrei - aber kompliziert ist wahrscheinlich schöner
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
hans ditter

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

AW: Chat mit PM

  Alt 8. Okt 2010, 12:23
Hi Sir Rufo,
ich kann ja verstehen, dass du das alles kompliziert findest... aber wie ich schonmal sagte, ich bin noch ein totaler newbie auf dem Themengebiet.
Die Liste sollte den UserNick, die IP und einen POINTER auf das entsprechende Socket enthalten, damit man das richtige Socket über den UserNick oder die IP finden kann.
Zu dem Protokoll-Ding: Ich habe sowas noch nie gemacht. Wenn ich mal Diskussionsbeiträge gelesen hab, dann hörte sich das für mich immer so an, als ob man eine Datei schreibt, die dann so allgemeine Befehle enthält, sowas wie
Code:
/msg [RecUser] [sendUser] [message]
oder so ähnlich. Ich hab inzwischen verstanden, dass das nicht so ist, sondern das man spezielle Zeichen einsetzt, um zu erkenne, wo der Befehl anfängt und wo der Text (z.B. ja mit Zeilenumbrüchen).
Zu deiner Idee mit den JSON: Ich find es super von dir, dass du dein Wissen einbringst und mir damit helfen möchtest, aber ich steige da noch nicht ganz durch und konnte bei Google auch keine Tutrials oder Anleitungen finden (vielleicht fehlte mir auch nur das richtige Stichwort).
Wenn das wirklich soviel besser ist, dann würde ich mich über eine nähere Erläuterung oder ein Tut o.ä. freuen.
Um dir meine Verständnisprobleme näher zu bringen (vielleicht sind die ja auch etwas dämlicher Natur ):
- was machst du mit o:=SO;//Struktur vorbereiten ?
- wenn du erst die Struktur mit "SO" vorbereitet hast, wieso verwendest du dann für die Nachricht an sich nur noch o.S[ 'CMD' ] := 'MSG';//etc. ??
- . . .
Vielleicht könntest du das ganze nochmal näher erläutern, denn ich würd das gerne einsetzten, nur möchte ich verstehen, was ich mache und nicht nur abschreiben, was andere mir vorsetzten.

So, hoffe meine Problemlage ist jetzt ganz deutlich geworden. Würde mich freuen wenn ihr mir (vgl.bar mit einem störrischen / dämlichen Kunden... ) weiter helfen würdet. Hab hier in der DP schon einiges dazugelernt.

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

Delphi Programming is the best one!
  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
 
#6

AW: Chat mit PM

  Alt 8. Okt 2010, 14:20
Den Link wo man JSON für Delphi bekommt habe ich hier schon gepostet (s. in den oberen Threads)
o := SO; erzeugt mir ein leeres JSON-Object, mit dem ich ab jetzt arbeiten kann.
Jetzt möchte ich diesem JSON-Object für die Eigenschaft 'CMD' den String-Wert 'MSG' übergeben.
Das schöne bei JSON-Objekte ist, die Eigenschaft wird automatisch angelegt, wenn diese noch nicht existiert.
also
o.S[ 'CMD' ] := 'MSG'; Wenn ich einen Integer-Wert übergeben möchte schreibe ich einfach
o.I[ 'Wert' ] := 10; Auslesen geht genauso einfach
if o.S[ 'CMD' ] = 'MSGthen Unter dem Link findest du auch ein Forum sowie eine kurze Anleitung.

Stell dir das JSON erstmal so vor: Da kann ich sehr einfach was reinschmeissen und wieder auslesen und das gesamte bekomme ich als Text ShowMessage( o.AsJSON ); geliefert und kann das sonstwohin schieben (z.B. als Nachricht über den Socket).

Das JSON-Objekt ist dabei nur Hilfsmittel, weil du dich um das korrekte Verpacken und Trennen der einzelnen Teile nicht selber kümmern musst. Du brauchst es nur benutzen.
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
hans ditter

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

AW: Chat mit PM

  Alt 8. Okt 2010, 20:56
Hey, super das du doch geantwortet hast... ich hatte schon befürchtet, ich hab jetzt alle abgeschreckt...
Das hört sich doch super an... damit sind meine größten Probleme schonmal geklärt... DANKE!!
Aber ich habe da noch immer ein Problem bei der Serverabfrage (wobie diese eher auf dem Verständnis des Vorgangs beruht):
Delphi-Quellcode:
o.I[ 'COUNT' ] := 0;
        // Senden
        for idx := 0 to TServerWinSocket( Sender ).ActiveConnections - 1 do
          // an alle?
          if ( ( o.[ 'TO' ] = '' ) or
            // an diesen Benutzer?
            ( o.S[ 'TO' ] = <Deine Userabfrage> ) ) and
            // nicht an den Client der gerade sendet
            ( Socket <> TServerWinSocket( Sender ).Connections[ idx ] ) then
            begin
              TServerWinSocket( Sender ).Connections[ idx ].SendText( o.AsJSON );
              o.I[ 'COUNT' ] := o.I[ 'COUNT' ] + 1;
            end;
         // Und wieder zurück an den Client
         Socket.SendText( o.AsJSON );
      end;
Was passiert in diesem Abschnitt?
1.) Ich kann dem ganzen soweit folgen, dass ein Integerwert 'Count' angelegt wird und mit null gefüllt ist. Aber wofür brauchst du diesen Integerwert??
2.) Warum fragst du ab, ob an alle oder nur an eine Person und nicht an den sendenden Clienten geschickt werden soll? Denn nach dem then schickst du die Nachricht doch sowieso wieder an alle (mit der for-Schleife).
Der Rest ist mir im Moment noch ziemlich klar... mal schauen, vlt ergeben sich da ja auch noch Probleme.

Dann hätte ich zu dem JSON-Quellcode noch eine Frage. Ich hab leider nur Turbo Delphi... ist das richtig, dass dies nichtmal eine Komponente ist, die man installieren kann? Sondern die man nur im uses-Bereich einfügen muss? Ich bin davon mal ausgegangen, aber in welchen Ordner muss ich dann die superobject.pas Datei speichern? Ich dachte mir unter C:/Programme/Borland/BDS/source ... aber wo dann hin? Ich hab da die Ordner dUnit, Indy10, IntraWeb, ToolsAPI und Win32 anzubieten...

Ich freue mich schon auf deine nächste Antwort,
hans ditter

p.s.: Natürlich auch an alle anderen ein großes Dank, die sich hier beteiligt haben, um mir zu helfen. Vor allem natürlich xZise.
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  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
 
#8

AW: Chat mit PM

  Alt 7. Okt 2010, 17:56
Wenn du mal erklären könntest, warum du die Sockets in einer eigenen Liste speichern möchtest.

Denn mir erschließt sich das nicht.

Der ServerSocket hat alle benutzten Sockets in einer Liste vorrätig. Da ist eine eigene Liste irgendwie doppelt gemoppelt.
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
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 22:01 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