Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ServerSocket fehler?? Wenn es ein Fehler ist (https://www.delphipraxis.net/94963-serversocket-fehler-wenn-es-ein-fehler-ist.html)

tomate007 28. Jun 2007 17:10


ServerSocket fehler?? Wenn es ein Fehler ist
 
Hallo, ich bin Anfänger und versuche mich gerade dadran einen Netzwerkchat zu programmieren. Also folgende Sache:

Wenn der Client auf Connect klickt, soll der Server folgende 2 Zeilen schicken.

Einmal:
[-Nachricht-] Servernachricht: User '+Benutzer+' hat sich eingeloggt.

und einmal
[-User_Add-] '+Benutzer+''

Also habe ich das so programmiert:

Delphi-Quellcode:
Nachricht_out := '[-Nachricht-] Servernachricht: User '+Benutzer+' hat sich eingeloggt.';
  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do begin
  ServerSocket1.Socket.Connections[i].SendText(Nachricht_out);
  end;
und einmal

Delphi-Quellcode:
Nachricht_out := '[-User_Add-] '+Benutzer+'';
  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do begin
  ServerSocket1.Socket.Connections[i].SendText(Nachricht_out);
  end;
Habe gedacht das er es einzelnt sendet, doch was passiert, beim Client kommt es zusammen an also so:

[-Nachricht-] Servernachricht: User Benutzer hat sich eingeloggt.[-User_Add-] Benutzer

ich brauch es aber, damit der Client die kommandos in der [--] versteht, das er die sachen einzelnt sendet.

also muss ich ja denke ich mal zwischen den for's noch irgendwie den Buffer wieder frei geben und senden bevor das 2. For kommt oder wie?

Danke für die Hilfe

Andre

shmia 28. Jun 2007 17:29

Re: ServerSocket fehler?? Wenn es ein Fehler ist
 
Zitat:

Zitat von tomate007
ich brauch es aber, damit der Client die kommandos in der [--] versteht, das er die sachen einzelnt sendet.

Das ist ein Denkfehler. Der Client muss selber feststellen, an welcher Stelle ein neuer Befehl beginnt.
Der Client muss alle Datenpakete hintereinander setzen und daraus seine Befehle entnehmen.
Bleibt ein "halber" Befehl im Puffer, muss der Client diesen bis zum Empfang des nächsten Datenpakets
zwischenspeichern.

Viele Internetprotokolle (FTP, SMTP, POP3, ...) verwenden einen Zeilenumbruch (LF) als Trenner zwischen den einzelnen Befehlen.
Das würde ich dir auch empfehlen.

Hier etwas Pseudocode:
Delphi-Quellcode:
var
   daten:string;
procedure TForm1.OnReceive();
var
   p : integer;
   befehl : string;
begin
   // Daten anhängen
   daten := daten + socket.ReceiveString;

   // Nach Befehlen suchen
   repeat
      p := Pos(daten, #10);  // Suche nach Befehlstrenner
      if p <> -1 then
      begin
        befehl := Copy(daten, 1, p); // einzelnen Befehl rausziehen
        Delete(daten, 1, p+1); // Befehl aus Puffer löschen
        ExecuteBefehl(befehl); // Befehl ausführen
      end;
   until p=-1;
end;

tomate007 28. Jun 2007 21:20

Re: ServerSocket fehler?? Wenn es ein Fehler ist
 
Nichts für ungut... aber laut meiner bescheidenen Meinung nach sind fehler in deinem Code, habe nun den genommen:


Delphi-Quellcode:
daten := Socket.ReceiveText;
      repeat
      p := Pos('#10',daten);  // Suche nach Befehlstrenner
      if p <> 0 then
      begin
      Status_Nachricht := Copy(daten, 1, p-1); // einzelnen Befehl rausziehen
      Delete(daten, 1, p+2); // Befehl aus Puffer löschen
      showmessage(Status_Nachricht); // Befehl ausführen
      end;
      until p=0;

Muetze1 28. Jun 2007 21:41

Re: ServerSocket fehler?? Wenn es ein Fehler ist
 
Zitat:

Zitat von tomate007
Nichts für ungut... aber laut meiner bescheidenen Meinung nach sind fehler in deinem Code, habe nun den genommen:

Dito: Eine sehr wichtige Sache, auf die shmia auch extra eingegangen ist, hast du nicht mit übernommen. Dein Code klappt nur, wenn du komplette Befehle empfängst. Halbe Befehle gehen unter (bzw. nur der zweite Teil wird verarbeitet).

Ändere die erste Zeile so ab:
Delphi-Quellcode:
daten := daten + Socket.ReceiveText;

tomate007 29. Jun 2007 16:46

Re: ServerSocket fehler?? Wenn es ein Fehler ist
 
naja es klappt ja jetzt, allerdings mißbrauche ich den Thead mal direkt weiter.


Und zwar, wenn ich den Client schließe, dann soll er ja die Connection zum Server abbauen. Also hab ich es so gemacht:

Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if (ClientSocket1.Active) then // noch online?
    ClientSocket1.Close; // ja, dann trennen
end;
und was passiert dann beim Server, es kommt eine Fehlermeldung:

Asynchroner Socket-Fehler 10053

warum kommt dieser bekloppte Fehler??
Ich hab kein Plan warum!!

Kommt sobald der Client

ClientSocket1.Close;

macht.

Bitte helft mir :D

MFG
Andre

Luckie 29. Jun 2007 17:44

Re: ServerSocket fehler?? Wenn es ein Fehler ist
 
Zitat:

Zitat von tomate007
naja es klappt ja jetzt, allerdings mißbrauche ich den Thead mal direkt weiter.

Nein. Für eine neue Frage, erstell einen neuen Thread, sonst findet man mit der Suche gar nichts mehr. Ich schliesse mal hier an der Stelle.


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