Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TServerSocket kombiniert 2 Nachrichten... (https://www.delphipraxis.net/16773-tserversocket-kombiniert-2-nachrichten.html)

---Bernhard--- 23. Feb 2004 10:51


TServerSocket kombiniert 2 Nachrichten...
 
Hallo!

Habe folgendes Problem mit meinem Chat-Programm (TServerSocket und TClientSocket):

Nach dem Verbindungsaufbau zum Server sendet der Client einen Text (Nachricht 1).
--> Server erhält den Text (Nachricht 1).
--> Server will den Text an die Clients weiterleiten (Nachricht 1).
--> Bei einer neuen Verbindung zu einem Client sendet der Server automatisch einen (anderen) Text an alle Clients (Nachricht 2).
--> Server sendet beide Texte gleichzeitig.
--> Client(s) empfängt/empfangen folgenden Text: Nachricht 1Nachricht 2
--> :evil: :evil: :evil: :evil: :kotz:
--> (Server bzw. Client stürzen evtl. ab (z.B. wenn die Nachricht ein bestimmter Text ist, der dann einen Befehl ausführt...). )

Wie kann ich dieses Problem beheben? Hoffe, ich habe mich verständlich ausgedrückt.

Danke im Voraus!

MfG


PS: Ich habe die Suche benutzt, aber nichts gefunden. Ich weiß auch gar nicht genau, nach was ich suchen soll.

sakura 23. Feb 2004 10:54

Re: TServerSocket kombiniert 2 Nachrichten...
 
Zitat:

Zitat von ---Bernhard---
--> Bei einer neuen Verbindung zu einem Client sendet der Server automatisch einen (anderen) Text an alle Clients (Nachricht 2).

Wo kommt diese Nachricht 2 her? Zaubert der Server :gruebel:

...:cat:...

---Bernhard--- 23. Feb 2004 10:57

Re: TServerSocket kombiniert 2 Nachrichten...
 
Zitat:

Zitat von sakura
Zitat:

Zitat von ---Bernhard---
--> Bei einer neuen Verbindung zu einem Client sendet der Server automatisch einen (anderen) Text an alle Clients (Nachricht 2).

Wo kommt diese Nachricht 2 her? Zaubert der Server :gruebel:

...:cat:...

Nein, ich hab' halt in "OnClientConnect" reingeschrieben, dass er einen bestimmten Text (an alle Clients) senden soll (fester Text).

Vjay 23. Feb 2004 11:03

Re: TServerSocket kombiniert 2 Nachrichten...
 
Alles was du in den SOcket reinschreibst, kommt hintereinander an, d.h. wen ndu in funktion 1 sendtext("hallo") schreibst und in einer anderen sendtext(" du") wird "hallo du" ankommen.
Einzige Ausnahme wenn die beiden Befehle zeitlich soweit auseinander liegen, dass der Winsock-Buffer vorher gesendet wird.

Ich hab das immer so gelöst, dass ich vor die Nachricht die Länge der Nachricht geschrieben und im Empfangs-Handler die Nachrichten wieder auseinandergefriemelt habe.

Beispiel:
sendtext(inttostr(5)+','+'Hallo');
sendtext(inttostr(3)+','+' du');

Dabei musst du aber auchnoch aufpassen, da von "5, Hallo" evtl. zu diesem Zeitpunkt nur "5, H" angekommen sind. Und die "allo" noch auf der Leitung unterwegs sind. D.h. die Empfangs+verarbeitungsroutine muss schon etwas aufwendiger sein.

Oder liege ich da falsch?

Pseudemys Nelsoni 23. Feb 2004 11:04

Re: TServerSocket kombiniert 2 Nachrichten...
 
zeig doch mal deinen code... sendest du auch #13#10 ?

---Bernhard--- 23. Feb 2004 11:16

Re: TServerSocket kombiniert 2 Nachrichten...
 
Zitat:

Zitat von Pseudemys Nelsoni
zeig doch mal deinen code... sendest du auch #13#10 ?

Also...:

Delphi-Quellcode:
// OnConnect von Client:
  if ClientSocket1.active=true
    then //Im Falle das ClientSocket verbunden ist wird die Message aus edit1 verschickt
      begin
        ClientSocket1.Socket.SendText('--> ' + NickName + ' betritt den Chat');
      end;


// OnClientRead von Server
  msg:= Socket.ReceiveText;
  vonWem:= socket.RemoteAddress;
  {...}
  for I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
    begin // Anzahl der Teilnehmer
      with ServerSocket1.Socket.Connections[I] do
        begin // Auswahl des Teilnehmers
          if (Connected) then SendText(msg); // Text senden
        end;
    end;

// OnClientConnent von Server:
  for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
    begin
      with ServerSocket1.Socket.Connections[I] do // Anzahl der Teilnehmer
        begin // Auswahl des Teilnehmers
          if (Connected) then SendText('/\/UsernameSenden') ; // Text senden
          erfolgreich:= True;
        end;
 
// OnRead von Client:
  msg:= Socket.ReceiveText;
  if Copy(msg, 1, 3) <> '/\/'
    then
      begin
        If (SoundAbspielen= True) and ( Copy(msg, 1, length(form2.LabeledEdit2.Text)) <> Form2.LabeledEdit2.Text) then mediaplayer1.Play;
        Memo1.Lines.Add(msg); //text wird eingetragen
      end
    else
      begin
        befehl:= copy(msg, 4, Length(msg) - 3);
        BefehlAusfuhren(befehl);
      end;
Die Nachricht, die ich vom Client sende beinhaltet auch #13#10:
Code:
nachricht:= Nickname + ' (' + DateTimeToStr(now) + '):' + #13 + #10 + edit2.Text + #13 + #10;
ClientSocket1.Socket.SendText(nachricht);
Hoffe, jetzt ist es klarer, wo mein Problem liegt...

Edit1: Ist das Problem evtl. mit Indy behoben?

Pseudemys Nelsoni 23. Feb 2004 11:19

Re: TServerSocket kombiniert 2 Nachrichten...
 
hi,

änder mal das:

"ClientSocket1.Socket.SendText('--> ' + NickName + ' betritt den Chat'); "

in das:

Delphi-Quellcode:
ClientSocket1.Socket.SendText('--> ' + NickName + ' betritt den Chat' + #13#10);
am besten für alle sendtext commands die du hast

---Bernhard--- 23. Feb 2004 11:28

Re: TServerSocket kombiniert 2 Nachrichten...
 
Zitat:

Zitat von Pseudemys Nelsoni
änder mal das:

"ClientSocket1.Socket.SendText('--> ' + NickName + ' betritt den Chat'); "

in das:

Delphi-Quellcode:
ClientSocket1.Socket.SendText('--> ' + NickName + ' betritt den Chat' + #13#10);
am besten für alle sendtext commands die du hast

Sorry, jetzt sendet er folgendes:
'Nachricht 1
Nachricht 2'
(^^^^ auch in einem String...)

Vjay 23. Feb 2004 11:30

Re: TServerSocket kombiniert 2 Nachrichten...
 
Da du meinen Betrag ja ignorierst, dann lies doch in der Emfangsroutine einfach bis #13#10 ein, dann hast du das Problem auch gelöst.

---Bernhard--- 23. Feb 2004 11:49

Re: TServerSocket kombiniert 2 Nachrichten...
 
Zitat:

Zitat von Vjay
Da du meinen Betrag ja ignorierst, dann lies doch in der Emfangsroutine einfach bis #13#10 ein, dann hast du das Problem auch gelöst.

Ich werde deine Lösung auch probieren (und ich igoriere deine Lösung nicht!). Sie ist halt unpraktisch. Kommt dann aber nicht auch wieder das Problem, dass er folgendes sendet:
'5,Hallo3, du'
--> also: 'Hallo3, du' ?

Was mich auch interessiert, ist, ob es mit Indy (oder einer anderen Kompo) dieses Problem nicht kommt. Dann würde ich mir halt die Arbeit machen, und "alles" umschreiben.

MfG


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