AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TServerSocket Reihenfolg OnClientRead vor/nach OnClientWrite
Thema durchsuchen
Ansicht
Themen-Optionen

TServerSocket Reihenfolg OnClientRead vor/nach OnClientWrite

Ein Thema von loetmann · begonnen am 17. Sep 2006 · letzter Beitrag vom 20. Sep 2006
Antwort Antwort
loetmann

Registriert seit: 21. Dez 2003
Ort: Rostock
33 Beiträge
 
Delphi 3 Standard
 
#1

TServerSocket Reihenfolg OnClientRead vor/nach OnClientWrite

  Alt 17. Sep 2006, 09:57
Hallo,

es ist Wochenende und ich hab Zeit zum proggen...

nun ich habe vor 2 Wochen angefangen mich mit Sockets zu beschäftigen.
Vorweg kein Indy ich hab Delphi 3.

So soweit funktioniert auch alles, Server starten Browser fragt an (Server.OnClientRead) und Server sendet Daten (Server.OnClientWrite). lokal.
Nun habe ich testweise von einem 2. Rechner im LAN mal den Browser gestartet und den Server angesprochen (http://192.168.0.5:80 -die 80 hätt ich auch weglassen können).

So ich dachte es tritt erst ein OnClientRead und dann das OnClientWrite - Ereignis ein. Hier war es auf einmal anders herum

Nun ich könnte alle Befehle im OnClientRead reinpacken, aber das ist doch nicht Sinn der Sache, oder?

Die Frage:
Sollte bei Sockets immer erst das OnClientRead vor dem OnClientWrite auftreten oder ist das unabhängig?

Wenn ja ist das blöd, weil ich OnClientWrite wissen muß was der Browser mir übergeben hat. Und manuell kann ich kein OnClientWrite auslösen?

ich hoffe Ihr könnt mir die Frage beantworten
ein Gruß
LM
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW

  Alt 17. Sep 2006, 12:20
Da sollte dir flossinger helfen können, der weiss das...

/EDIT: Oh, ein Rostocker - Grüsse quer durch die Stadt...
  Mit Zitat antworten Zitat
loetmann

Registriert seit: 21. Dez 2003
Ort: Rostock
33 Beiträge
 
Delphi 3 Standard
 
#3

Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW

  Alt 17. Sep 2006, 12:31
Hallo,

ich hab jetzt eine Antwort im Delphi-Forum erhalten.
So soll es einen Bug mit OnWrite geben, dieses wird nur einmal angestoßen.

Ich mache es jetzt so das ich warte bis beide Ereignisse eingetrten sind und sende dann die Daten.

Ein Gruß
LM

Edid: Grüße zurück
  Mit Zitat antworten Zitat
flossinger

Registriert seit: 22. Aug 2005
Ort: südlich der Alpen
109 Beiträge
 
Delphi 5 Standard
 
#4

Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW

  Alt 19. Sep 2006, 21:13
@mütze: danke für die Blumen, leider weiss ich sehr wenig über die write Ereignisse der tsockets.

@lötmann:

Wenn der server Daten vom client bekommt, dann tritt serversocket.onclientread auf. Da kannst du alles in empfang nehmen und auswerten.

Das serversocket.onclientwrite tritt nur ganz am Anfang beim Verbindungsaufbau auf. Wenn die Verbindung bereits steht und neue Daten eintreffen, dann tritt es nicht mehr auf. Wenn du auf eintreffende Daten reagieren willst, brauchst du serversocket.onclientread nicht.

Was dieses serversocket.onclientwrite genau über den Status des Verbindungsaufbaus aussagt im Unterschied zu serversocket.connect, ist mir nicht bekannt. da hab ich noch nichts darüber gelesen. Gibt es einen Beleg oder eine Quellenangabe darüber, dass es sich um einen bug handelt? Oder ist das ein Gerücht?

grüsse,
der flossinger
  Mit Zitat antworten Zitat
loetmann

Registriert seit: 21. Dez 2003
Ort: Rostock
33 Beiträge
 
Delphi 3 Standard
 
#5

Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW

  Alt 19. Sep 2006, 22:54
Hallo flossinger,

das mit dem Bug habe ich unter:
http://www.delphi-forum.de/topic_TSe...ite_64541.html
gelesen, aber nicht weiter verfolgt.

Folgende Reihenfolge habe ich beim Ausprobieren erhalten:
Code:
Server.OnGetSocket       //1.Verbindungswunsch vom Client
Server.OnClientConnect   //2.Client hat sich verbundent, Socket ab hier verfügbar
Server.OnAccept          //3.Verbindung vom Server akzeptiert

Server.OnClientRead      //4.Daten wurden empfangen, können gelesen werden
Server.OnClientWrite     //5.Socket ist beschreibbar, kann auch mal vor Read aufkommen!

Server.OnClientDisconnect //Verbindung zum Client beendet, tritt nach Aufruf von Server.close; auf

Server.OnClientError     //das konnte ich nicht testen
Im OnClientConnect erzeuge ich mir ein Thread, dieser wartet auf Accept, Read, Write wobei bei read die übergebenen Daten eingelesen werden. Danach sende ich meine Antwort zurück. Das klappt auch alles, Theoretisch könnte ich auf ClientWrite und OnAccept verzichten und nur auf OnClientRead warten das die Verbindung ja akzeptiert sein muß um Daten zu erhalten.

Wobei im OnAccept bestimmt selber ernscheinden soll ob ich den Clienten haben will oder nicht.?.

Womit jetzt noch Probleme habe ist wenn den Client sich disconnect (z.B. wenn ich beim Laden im Webbrowser auf Stop oder Reload klicke). Bis mir was besseres über den Weg läuft fange ich die entstehende Exception über AppException ("TServerClientWinSocket Asynchroner Socket-Fehler 10053") ab und lösche meinen Thread und den Socket. Schade ist das hier nicht ein OnClientDisconnect oder OnClientError auftritt....

Ich lese gerade das es noch OnErrorEvent und OnSocketEvent gibt, vielleicht hilft mir das weiter.



Ein Gruß
LM
  Mit Zitat antworten Zitat
flossinger

Registriert seit: 22. Aug 2005
Ort: südlich der Alpen
109 Beiträge
 
Delphi 5 Standard
 
#6

Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW

  Alt 20. Sep 2006, 04:39
Hallo LM,

ich verwende die sockets nonblocking. Da brauche ich keine Threads. Das Warten erledigt ohnehin das socketobjekt mit seinen Ereignissen.

onread setzt, wie du schreibst, ohnehin voraus, dass die Verbindung steht, mehr brauchst du nicht. Im onread kannst du zusätzlich zur Überprüfung und Verarbeitung der Daten noch prüfen, wer der Absender ist, das ist ja auch nicht ganz unwichtig.

Auch bei omaccept unerwünschte Verbindungen zu disconnecten ist sinnvoll. Es kommt ja oft genug fremder Mist übers Netz.

Die Verbindungsabbrüche durch den client lassen sich mit onclienterror gut behandeln. dort setze ich den errorcode auf 0, so dass keine exception auftritt. clientdisconnect wird vom socket noch routinemässig versucht, muss aber in diesem Fall fehlschlagen. Da der errorcode auch hier wieder auf 0 gesetzt wird, kann unter Berücksichtigung des Verbindungsabbruchs weiter gearbeitet werden.

Grüsse,
der flossinger
  Mit Zitat antworten Zitat
loetmann

Registriert seit: 21. Dez 2003
Ort: Rostock
33 Beiträge
 
Delphi 3 Standard
 
#7

Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW

  Alt 20. Sep 2006, 19:16
Hallo,

ja mein Server steht auch auf stNonBlocking. Einen Threat habe ich genommen damit ich mehrere Clienten parallel abarbeiten kann (mit Threa dmeine ich nicht stThreadBlocking).

Oder laufen die Socket automatisch in Threads, d.h. parallel?

Die Behandlung der Anfrage bei OnAccept könnte ich noch einbauen, mal gucken was dort an Daten vorhanden ist. (nachguck: Sinvoll RemoteHost, RemoteAddress, RemotePort?)

Also das mit dem myServerOnClientError funktioniert bei mir nicht, ich kann den Fehler nur über AppException abfangen... ich teste das mit nem großen Bild was ich per Wlan an nem PDA sende (das geht schön langsam ) sobald ich aber auf Stop klicke bekomme ich nur ne AppException.

Ich werd jetzt mal ein wenig zusammenstreichen (OnClientWrite).

Ein Gruß
LM
  Mit Zitat antworten Zitat
flossinger

Registriert seit: 22. Aug 2005
Ort: südlich der Alpen
109 Beiträge
 
Delphi 5 Standard
 
#8

Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW

  Alt 20. Sep 2006, 19:55
ok, dann reden wir von dem selben Ding. nonblocking socketobjekte. Gut zu wissen.

Mehrere socketobjekte können nacheinander gestartet werden und dann parallel empfangen. Aber was meinst du genau? Ein server und ein client, mehrere clients, mehrere servers? Machs am Anfang nicht zu kompliziert. Das Arbeiten mit den spärlich dokumentierten Dingern ist schon so eine schöne Aufgabe. Übrigens, was soll das werden? Ein http server? Sowas geht mit einem einzigen serversocket. Der kann ja mehrere connections zu verschiedenen clients bedienen.

Die richtigen Daten, um eine Verbindung zu zu lassen oder wieder zu trennen hast du schon entdeckt: remoteaddress usw.

".. geht bei mir nicht .." ist etwas wenig Beschreibung. Stell mal bitte fest, ob das ServerSocket1ClientError eintritt. Hast du auch den parameter errorcode dort auf 0 zurückgesetzt?

grüsse,
der flossinger
  Mit Zitat antworten Zitat
loetmann

Registriert seit: 21. Dez 2003
Ort: Rostock
33 Beiträge
 
Delphi 3 Standard
 
#9

Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW

  Alt 20. Sep 2006, 20:18
Hallo,

das ging ja fix

Also ich habe alle möglichen Event "angelinkt" und gebe mir ein paar Infozeilen in nem Memo aus.

Ansich ist es nur ein kleines Projekt, ein Server (http) mehrere Clients(meist nur einer). Ansich will ich einen HTPC mit nem PDA über WLAN steuern. Evtl auch mal über Web um Timer o.ä. für TV-Aufnahmen anzulegen. Naja, dafür reicht der Server zum jetzigen Punkt, ist aber besser wenn ich es "richtig" mache.

Zitat:
".. geht bei mir nicht .." ist etwas wenig Beschreibung. Stell mal bitte fest, ob das ServerSocket1ClientError eintritt. Hast du auch den parameter errorcode dort auf 0 zurückgesetzt?
nein das tut es nicht, ich bekomme nur ein AppExeption. Ich habe das so verlinkt:
Server.OnClientError := mySocketServerHC.myServerOnClientError; +entsprechende Funktion:

Delphi-Quellcode:
procedure T_SocketServer.myServerOnClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); // Fehler beim verwenden oder beenden d. Serversocket
var fehler:string;
begin
 try
  fehler:='';
  case ErrorEvent of
   eeGeneral :fehler:='Fehler generell';
   eeSend :fehler:='Fehler beim senden';
   eeReceive :fehler:='Fehler beim lesen';
   eeConnect :fehler:='Fehler beim connecten';
   eeDisconnect :fehler:='Fehler beim disconnecten';
   eeAccept :fehler:='Fehler beim akzeptieren';
  end;
  logtofile('['+datetimetostr(now)+']'+'[Fehler]myServerOnClientError ('+Socket.RemoteAddress+'): '+fehler); //infoo im Memo, auch in Log-Datei
  ErrorCode:=0;
 except
  logtofile('['+datetimetostr(now)+']'+'[Fehler]Fehler in myServerOnClientError');
 end;
end;
Oder muß ich den nehmen: Server.Socket.OnClientError?




Ein Gruß
LM
  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 14:58 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