Mithilfe der Tserversocket-Komponente
Dieser Brief wurde ursprünglich auf delphi3000.com gepostet.
Die Delphi-Dokumentation auf der TServerSocket multithreading Fähigkeiten kann ein wenig spärlich für das ungeübte Auge erscheinen. Ich werde versuchen und ein wenig mehr Aufschluss über das Thema.
Eigentlich ist es ziemlich leicht zu einen Multithread-Server machen, der Nachrichten über ein Socket überwacht. Delphi hat eine Komponente dafür: der TServerSocket.
Aber man braucht ein wenig wissen, es zu benutzen.
Um Ihre Arbeit zu strukturieren, sollten Sie:
-Fügen Sie eine TServerSocket auf dem Hauptformular.
-Die Servertype-Eigenschaft auf StThreadBlocking festgelegt
-Erstellen Sie eine neue Einheit (siehe unten) mit dem Serverthread.
Machen Sie den folgenden Code auf die OnSocketGetThread
Procedure TfrmMain.fSocketGetThread (Sender: TObject;
ClientSocket: TServerClientWinSocket;
Var SocketThread: TServerClientThread);
beginnen
Dadurch entsteht das TServerThread-Objekt, das ich gezeigt habe
Im folgenden Code. Jedes Mal wird ein neues Objekt erstellt.
Eine neue Verbindung hergestellt.
SocketThread: = TServerThread.Create (FALSE, ClientSocket);
Ende;
Die TServerThread ist ein Objekt, das ich mir selbst geschaffen habe. Die Objekt-Inheits aus TServerClientThread und enthält den Code, die tatsächlich lesen und Schreiben vom Sockel.
Das Gerät habe, das ich erstellt, enthält mindestens den folgenden Code:
Einheit Serverthread;
Schnittstelle
verwendet
Windows, Scktcomp, SysUtils, Klassen, Formen;
Typ
EServerThread = Class (Exception);
Die Serverthread ist ein Abkömmling der
TServerClientThread
TServerThread = Class (TServerClientThread)
Private
fSocketStream: TWinSocketStream;
öffentliche
Prozedur ClientExecute; außer Kraft setzen;
Die ClientExecute überschreibt die
TServerClientThread.ClientExecute
und enthält den eigentlichen Code, ist
ausgeführt, wenn der Thread gestartet wird
Ende;
Umsetzung
Prozedur TServerThread.ClientExecute;
beginnen
FreeOnTerminate geerbt: = TRUE;
versuchen Sie
fSocketStream: = TWinSocketStream.Create (ClientSocket,
100000);
100000 ist das Timeout in Millisekunden.
versuchen Sie
während (nicht beendet) und (ClientSocket.Connected)
versuchen Sie
Dies ist, wo Sie das eigentlich tun
Warten auf Eingabe, lesen und schreiben
Die folgenden Beispiele zeigt was Sie kann
Fügen Sie hier.
außer auf E:exception Do
beginnen
Ein Fehler ist aufgetreten, schließen und beenden
ClientSocket.Close;
Enden;
Ende;
Ende;
Schließlich
fSocketStream.Free;
Ende;
außer auf E:exception Do
beginnen
Ein Fehler ist aufgetreten, schließen und beenden
ClientSocket.Close;
Enden;
Ende;
Ende;
Ende;
Wenn die Verbindung hergestellt ist, muss der Thread für eingehende Daten warten. Diesen Code können Sie auf Daten warten:
Wenn (nicht beendet) und
(nicht fSocketStream.WaitForData (1000000)) dann
beginnen
Behandeln Sie das timeout
Ende;
Eingehende Daten gibt es auf dem Sockel!
Um Daten zu lesen, sollten Sie zum Speichern der Daten in einen Puffer haben. In der Regel ist der Puffer ein PByteArray oder ein Array von Zeichen. In diesem Beispiel habe ich einen Puffer fRequest ist ein Array von Zeichen genannt. Außerdem erwarte ich eine feste Anzahl von Bytes. Mein Array hat die Größe der Konstante REQUESTSIZE.
var
AC, Readlen: Integer;
beginnen
FillChar (fRequest, REQUESTSIZE, 0);
AC: = 0;
Wiederholen Sie die
Readlen: = fSocketStream.Read (fRequest [Ac],
1024);
Ich lese in Blöcken von 1024 Bytes, bis der Puffer
ist voll
AC: = Ac + Readlen;
bis (Readlen = 0) oder (Ac = REQUESTSIZE);
Ende;
Wenn Readlen 0 ist erhalte ich keine keine Daten mehr. Die Read-Funktion nach 100000 Millisekunden Timeout, wie in der TWinSocketStream.Create() angegeben. Wenn Sie nicht, wie viele Daten kennen zu erwarten, sollten Sie diese Zeitspanne relativ kleine festlegen. 30 Sekunden sollte maximal in den meisten Situationen.
Wenn Sie eine Antwort senden, sollten Sie Ihre Kunden-Verhalten beachten. Viele Clients wartet nur ein Paket der Antwort, andere erwartet viele Pakete.
In diesem Beispiel habe ich einen Client, der nur ein Paket erwartet, so habe ich meine Daten wieder am Stück zu senden:
fSocketStream.WriteBuffer (fRep, fReplySize);
Die fRep ist den Antwort-Puffer und fReplySize ist so groß wie die Replybuffer.
Mithilfe der Tserversocket-Komponente
Mithilfe der Tserversocket-Komponente : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Dieser Brief wurde ursprünglich auf delphi3000.com gepostet.
Die Delphi-Dokumentation auf der TServerSocket multithreading Fähigkeiten kann ein wenig spärlich für das ungeübte Auge erscheinen. Ich werde versuchen und ein wenig mehr Aufschluss über das Thema.
Eigentlich ist es ziemlich leicht zu einen Multithread-Server machen, der Nachrichten über ein Socket überwacht. Delphi hat eine Komponente dafür: der TServerSocket.
Aber man braucht ein wenig wissen, es zu benutzen.
Um Ihre Arbeit zu strukturieren, sollten Sie:
-Fügen Sie eine TServerSocket auf dem Hauptformular.
-Die Servertype-Eigenschaft auf StThreadBlocking festgelegt
-Erstellen Sie eine neue Einheit (siehe unten) mit dem Serverthread.
Machen Sie den folgenden Code auf die OnSocketGetThread
Procedure TfrmMain.fSocketGetThread (Sender: TObject;
ClientSocket: TServerClientWinSocket;
Var SocketThread: TServerClientThread);
beginnen
Dadurch entsteht das TServerThread-Objekt, das ich gezeigt habe
Im folgenden Code. Jedes Mal wird ein neues Objekt erstellt.
Eine neue Verbindung hergestellt.
SocketThread: = TServerThread.Create (FALSE, ClientSocket);
Ende;
Die TServerThread ist ein Objekt, das ich mir selbst geschaffen habe. Die Objekt-Inheits aus TServerClientThread und enthält den Code, die tatsächlich lesen und Schreiben vom Sockel.
Das Gerät habe, das ich erstellt, enthält mindestens den folgenden Code:
Einheit Serverthread;
Schnittstelle
verwendet
Windows, Scktcomp, SysUtils, Klassen, Formen;
Typ
EServerThread = Class (Exception);
Die Serverthread ist ein Abkömmling der
TServerClientThread
TServerThread = Class (TServerClientThread)
Private
fSocketStream: TWinSocketStream;
öffentliche
Prozedur ClientExecute; außer Kraft setzen;
Die ClientExecute überschreibt die
TServerClientThread.ClientExecute
und enthält den eigentlichen Code, ist
ausgeführt, wenn der Thread gestartet wird
Ende;
Umsetzung
Prozedur TServerThread.ClientExecute;
beginnen
FreeOnTerminate geerbt: = TRUE;
versuchen Sie
fSocketStream: = TWinSocketStream.Create (ClientSocket,
100000);
100000 ist das Timeout in Millisekunden.
versuchen Sie
während (nicht beendet) und (ClientSocket.Connected)
versuchen Sie
Dies ist, wo Sie das eigentlich tun
Warten auf Eingabe, lesen und schreiben
Die folgenden Beispiele zeigt was Sie kann
Fügen Sie hier.
außer auf E:exception Do
beginnen
Ein Fehler ist aufgetreten, schließen und beenden
ClientSocket.Close;
Enden;
Ende;
Ende;
Schließlich
fSocketStream.Free;
Ende;
außer auf E:exception Do
beginnen
Ein Fehler ist aufgetreten, schließen und beenden
ClientSocket.Close;
Enden;
Ende;
Ende;
Ende;
Wenn die Verbindung hergestellt ist, muss der Thread für eingehende Daten warten. Diesen Code können Sie auf Daten warten:
Wenn (nicht beendet) und
(nicht fSocketStream.WaitForData (1000000)) dann
beginnen
Behandeln Sie das timeout
Ende;
Eingehende Daten gibt es auf dem Sockel!
Um Daten zu lesen, sollten Sie zum Speichern der Daten in einen Puffer haben. In der Regel ist der Puffer ein PByteArray oder ein Array von Zeichen. In diesem Beispiel habe ich einen Puffer fRequest ist ein Array von Zeichen genannt. Außerdem erwarte ich eine feste Anzahl von Bytes. Mein Array hat die Größe der Konstante REQUESTSIZE.
var
AC, Readlen: Integer;
beginnen
FillChar (fRequest, REQUESTSIZE, 0);
AC: = 0;
Wiederholen Sie die
Readlen: = fSocketStream.Read (fRequest [Ac],
1024);
Ich lese in Blöcken von 1024 Bytes, bis der Puffer
ist voll
AC: = Ac + Readlen;
bis (Readlen = 0) oder (Ac = REQUESTSIZE);
Ende;
Wenn Readlen 0 ist erhalte ich keine keine Daten mehr. Die Read-Funktion nach 100000 Millisekunden Timeout, wie in der TWinSocketStream.Create() angegeben. Wenn Sie nicht, wie viele Daten kennen zu erwarten, sollten Sie diese Zeitspanne relativ kleine festlegen. 30 Sekunden sollte maximal in den meisten Situationen.
Wenn Sie eine Antwort senden, sollten Sie Ihre Kunden-Verhalten beachten. Viele Clients wartet nur ein Paket der Antwort, andere erwartet viele Pakete.
In diesem Beispiel habe ich einen Client, der nur ein Paket erwartet, so habe ich meine Daten wieder am Stück zu senden:
fSocketStream.WriteBuffer (fRep, fReplySize);
Die fRep ist den Antwort-Puffer und fReplySize ist so groß wie die Replybuffer.
Mithilfe der Tserversocket-Komponente
By Wiezutun
Mithilfe der Tserversocket-Komponente : Mehreren tausend Tipps, um Ihr Leben einfacher machen.