![]() |
Delphi-Version: 7
Versenden von Variablen via Socket
Hallo zusammen,
ich versuche momentan mithilfe der Delphi 7 PE einen kleinen Chat zu schreiben. Ich arbeite momentan daran doppelte Namen zu unterbinden. Deshalb soll der Client beim Verbinden seinen Namen in eine Variable schreiben und an den Server schicken, wo der Name in einem Array gespeichert wird. Mein Problem ist folgendes:
Delphi-Quellcode:
Würde ich SendText benutzen so würde der Server den Namen wie eine Nachricht weiterverarbeiten. Wie kann ich das verhindern?
procedure TForm1.ChatServerClientRead(Sender: TObject;
Socket: TCustomWinSocket); var i:Integer; msg:String; begin msg := Socket.ReceiveText; memoVerlauf.Lines.add(msg); for i := 0 to ChatServer.Socket.ActiveConnections-1 do ChatServer.Socket.Connections[i].SendText(msg); end; LG Rudinii P.S.: Die TClient- und TServerSocket Komponenten hab ich ![]() |
AW: Versenden von Variablen via Socket
Hallo,
schick halt eine Art Kennung vor dem Namen an den Server so weiss dieser, dass das ein Clientname ist und verarbeitet den ankommenden Text dann nicht als Chatnachricht |
AW: Versenden von Variablen via Socket
Hab ich gemacht! Dankeschön :) War mir unsicher bei der Benutzung von AnsiEndsStr etc.
Jedoch tut sich mir ein viel größeres Problem auf: Wenn ein User eine Nachricht schreibt(was beim Beitreten automatisch passiert) wird folgendes ausgeführt:
Delphi-Quellcode:
Das Problem ist jetzt folgendes :
procedure TForm1.ChatServerClientRead(Sender: TObject;
Socket: TCustomWinSocket); var i,j:Integer; msg:String; begin msg := Socket.ReceiveText; if AnsiEndsStr('ist dem Chat beigetreten',msg) = true then begin useronlineint := useronlineint + 1; useronlinestr[useronlineint] := (StringReplace(msg, 'ist dem Chat beigetreten', '', [rfReplaceAll])); memoUsers.Lines.clear; for j := Low(useronlinestr) to High(useronlinestr) do begin memoUsers.Lines.add(useronlinestr[j]); end; end; if AnsiEndsStr('hat den Chat verlassen',msg) = true then begin //memoUsers.Lines.add(StringReplace(msg, 'hat den Chat verlassen', '', [rfReplaceAll])); //ENTFERNT IHN BEIM VERLASSEN useronlineint := useronlineint -1; useronlinestr[useronlineint] := ''; memoUsers.Lines.clear; for j := Low(useronlinestr) to High(useronlinestr) do begin memoUsers.Lines.add(useronlinestr[j]); end; end; memoVerlauf.Lines.add(msg); //SENDET NACHRICHTEN AN ALLE USER for i := 0 to ChatServer.Socket.ActiveConnections-1 do ChatServer.Socket.Connections[i].SendText(msg); end; Nehmen wir 3 User mit den Namen A, B und C. Treten diese nacheinander bei so steht im Array folgendes : useronlinestr [1]A [2]B [3]C Die Variable useronlineint(Die Anzahl der Personen online) ist nun 3. Verlässt User 2 den Chat und verbindet sich wieder geschieht folgendes: Im Array steht nun [1] A [2] [3]C Die Anzahl der User online ist 2. Tritt er wieder bei. So wird sein Name in useronlineint+1 geschrieben. Also in Array-Slot 3. Damit sind alle 3 User verbunden und C aus der Liste gelöscht. Wie kann ich es realisieren, dass C, wenn Slot 2 leer ist sofort auf diesen aufrückt? LG Rudinii |
AW: Versenden von Variablen via Socket
Hmm..
Wenn es DIr nur darum geht, eine Liste mit den Usernamen zu führen, dann nimm anstelle des Array doch einfach eine TStringlist. Dort dann einfach den User mit Delete entfernen, dann rutschen die anderen automatisch auf. ;) |
AW: Versenden von Variablen via Socket
Naja hab das Problem jetzt mithilfe eines Arrays gelöst. Jedoch bereitet mir der nächste Schritt-Probleme : Eine einzelne Socketverbindung abzulehnen.
Denn die Liste dient dazu zu verhindern, dass Namen doppelt benutzt werden. Wie kann ich das machen? Denn Socket.Close schließt alle Verbindungen, was eben nicht passieren soll... |
AW: Versenden von Variablen via Socket
Delphi-Quellcode:
ChatServer.Socket.Connections[Index].Close()
|
AW: Versenden von Variablen via Socket
Hatte ich schon versucht, aber trotzdem vielen Dank^^
Hatte den Fehler gemacht das ich als Index ChatServer.Socket.ActiveConnections angegeben hatte. Scheinbar ist der Index der 1sten Verbindung aber 0. Deswegen spuckte er mir immer nur einen Fehler aus. |
AW: Versenden von Variablen via Socket
Genau. Index der 1. Verbindung ist 0 und Index der letzten Verbindung
Delphi-Quellcode:
. Zu beachten ist, dass sich die Indizes der hinteren Connections logischerweise nach vorne verschieben, wenn einer der vorderen Clients disconnected.
ChatServer.Socket.ActiveConnections - 1
|
AW: Versenden von Variablen via Socket
Das habe ich bereits beachtet, vielen Dank :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 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