AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi ServerSocket fehler?? Wenn es ein Fehler ist
Thema durchsuchen
Ansicht
Themen-Optionen

ServerSocket fehler?? Wenn es ein Fehler ist

Ein Thema von tomate007 · begonnen am 28. Jun 2007 · letzter Beitrag vom 29. Jun 2007
Thema geschlossen
tomate007

Registriert seit: 1. Apr 2007
46 Beiträge
 
#1

ServerSocket fehler?? Wenn es ein Fehler ist

  Alt 28. Jun 2007, 17:10
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

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: ServerSocket fehler?? Wenn es ein Fehler ist

  Alt 28. Jun 2007, 17:29
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;
Andreas
 
tomate007

Registriert seit: 1. Apr 2007
46 Beiträge
 
#3

Re: ServerSocket fehler?? Wenn es ein Fehler ist

  Alt 28. Jun 2007, 21:20
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
(Gast)

n/a Beiträge
 
#4

Re: ServerSocket fehler?? Wenn es ein Fehler ist

  Alt 28. Jun 2007, 21:41
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:
daten := daten + Socket.ReceiveText;
 
tomate007

Registriert seit: 1. Apr 2007
46 Beiträge
 
#5

Re: ServerSocket fehler?? Wenn es ein Fehler ist

  Alt 29. Jun 2007, 16:46
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

MFG
Andre
 
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: ServerSocket fehler?? Wenn es ein Fehler ist

  Alt 29. Jun 2007, 17:44
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
 
Thema geschlossen


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 10:39 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