Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Versenden von Variablen via Socket (https://www.delphipraxis.net/188450-versenden-von-variablen-via-socket.html)

Rudinii 4. Mär 2016 18:39

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:
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;
Würde ich SendText benutzen so würde der Server den Namen wie eine Nachricht weiterverarbeiten. Wie kann ich das verhindern?
LG Rudinii
P.S.: Die TClient- und TServerSocket Komponenten hab ich so reingekriegt ^^

Helmi 4. Mär 2016 18:52

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

Rudinii 5. Mär 2016 10:33

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:
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;
Das Problem ist jetzt folgendes :
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

HolgerX 5. Mär 2016 13:09

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. ;)

Rudinii 5. Mär 2016 16:32

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...

Zacherl 5. Mär 2016 18:57

AW: Versenden von Variablen via Socket
 
Delphi-Quellcode:
ChatServer.Socket.Connections[Index].Close()

Rudinii 6. Mär 2016 10:30

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.

Zacherl 6. Mär 2016 11:39

AW: Versenden von Variablen via Socket
 
Genau. Index der 1. Verbindung ist 0 und Index der letzten Verbindung
Delphi-Quellcode:
ChatServer.Socket.ActiveConnections - 1
. Zu beachten ist, dass sich die Indizes der hinteren Connections logischerweise nach vorne verschieben, wenn einer der vorderen Clients disconnected.

Rudinii 6. Mär 2016 14:49

AW: Versenden von Variablen via Socket
 
Das habe ich bereits beachtet, vielen Dank :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 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