![]() |
TServerSocket Reihenfolg OnClientRead vor/nach OnClientWrite
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 ( ![]() 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 |
Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW
Da sollte dir
![]() /EDIT: Oh, ein Rostocker - Grüsse quer durch die Stadt... |
Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW
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 :-) |
Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW
@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 |
Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW
Hallo flossinger,
das mit dem Bug habe ich unter: ![]() gelesen, aber nicht weiter verfolgt. Folgende Reihenfolge habe ich beim Ausprobieren erhalten:
Code:
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.
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 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 |
Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW
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 |
Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW
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 |
Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW
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 |
Re: TServerSocket Reihenfolg OnClientRead vor/nach OnClientW
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:
Delphi-Quellcode:
+entsprechende Funktion:
Server.OnClientError := mySocketServerHC.myServerOnClientError;
Delphi-Quellcode:
Oder muß ich den nehmen: Server.Socket.OnClientError?
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; Ein Gruß LM |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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