AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Versenden von Variablen via Socket

Ein Thema von Rudinii · begonnen am 4. Mär 2016 · letzter Beitrag vom 6. Mär 2016
Antwort Antwort
Rudinii
(Gast)

n/a Beiträge
 
#1

Versenden von Variablen via Socket

  Alt 4. Mär 2016, 18:39
Delphi-Version: 7
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 ^^
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Versenden von Variablen via Socket

  Alt 4. Mär 2016, 18:52
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
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Rudinii
(Gast)

n/a Beiträge
 
#3

AW: Versenden von Variablen via Socket

  Alt 5. Mär 2016, 10:33
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
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#4

AW: Versenden von Variablen via Socket

  Alt 5. Mär 2016, 13:09
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.
  Mit Zitat antworten Zitat
Rudinii
(Gast)

n/a Beiträge
 
#5

AW: Versenden von Variablen via Socket

  Alt 5. Mär 2016, 16:32
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...
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Versenden von Variablen via Socket

  Alt 5. Mär 2016, 18:57
ChatServer.Socket.Connections[Index].Close()
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Rudinii
(Gast)

n/a Beiträge
 
#7

AW: Versenden von Variablen via Socket

  Alt 6. Mär 2016, 10:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Versenden von Variablen via Socket

  Alt 6. Mär 2016, 11:39
Genau. Index der 1. Verbindung ist 0 und Index der letzten Verbindung ChatServer.Socket.ActiveConnections - 1 . Zu beachten ist, dass sich die Indizes der hinteren Connections logischerweise nach vorne verschieben, wenn einer der vorderen Clients disconnected.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Rudinii
(Gast)

n/a Beiträge
 
#9

AW: Versenden von Variablen via Socket

  Alt 6. Mär 2016, 14:49
Das habe ich bereits beachtet, vielen Dank
  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 12:52 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