Dieses Schreiben wurde ursprünglich auf delphi3000.com
Die Delphi-Dokumentation über die TServerSocket's Multithreading-Fähigkeiten können ein wenig spärlich für das ungeübte Auge. Ich werde versuchen Schuppen und ein wenig mehr Licht zu den Themen.
Eigentlich ist es recht einfach, um eine Multithread-Server, hört für Mitteilungen auf einer Buchse. Delphi hat eine Komponente für diese: die TServerSocket.
Aber Sie brauchen ein bisschen von Wissen, es zu benutzen.
Um die Struktur Ihrer Arbeit, sollten Sie:
- Fügen Sie eine TServerSocket zu Ihren wichtigsten Form.
- Stellen Sie die Eigenschaft auf ServerType stThreadBlocking
- Erstellen Sie eine neue Einheit (siehe unten) mit dem Server-Thread.
Machen Sie den folgenden Code auf der OnSocketGetThread
Verfahren TfrmMain.fSocketGetThread (Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
beginnen
/ / Dies schafft die TServerThread Objekt Ich habe gezeigt,
/ / In den Code unten. Ein neues Objekt erstellt wird jedes Mal
/ / Eine neue Verbindung wird hergestellt.
SocketThread: = TServerThread.Create (FALSE, ClientSocket);
end;
Die TServerThread ist ein Objekt Ich habe mich. Das Objekt inheits aus TServerClientThread und enthält den Code, dass tatsächlich sind Lesen und Schreiben aus der Steckdose.
Das Gerät habe ich mindestens den folgenden Code ein:
Einheit serverthread;
Schnittstelle
verwendet
Fenster, scktcomp, SysUtils, Klassen, Formulare;
Typ
EServerThread = class (Exception);
/ / Die serverthread ist ein Nachkomme der
/ / TServerClientThread
TServerThread = class (TServerClientThread)
private
fSocketStream: TWinSocketStream;
öffentlichen
Verfahren ClientExecute; override;
/ / Die ClientExecute überschreibt die
/ / TServerClientThread.ClientExecute
/ / Und enthält den eigentlichen Code, der
/ / Ausgeführt, wenn der Thread gestartet wird
end;
Umsetzung
Verfahren TServerThread.ClientExecute;
beginnen
geerbt FreeOnTerminate: = true;
versuchen
fSocketStream: = TWinSocketStream.Create (ClientSocket,
100000);
/ / 100000 ist das Timeout in miliseconds.
versuchen
while (nicht beendet) und (ClientSocket.Connected) tun
versuchen
/ / Dies ist, wo Sie wird die tatsächliche
/ / Warten auf Eingabe, Lesen und Schreiben
/ / Die Beispiele unten zeigt, was Sie können
/ / Fügen sich hier ein.
ausser am e: Ausnahme machen
beginnen
/ / Ein Fehler ist aufgetreten, in der Nähe und Ausfahrt
ClientSocket.Close;
Beenden;
end;
end;
endlich
fSocketStream.Free;
end;
ausser am e: Ausnahme machen
beginnen
/ / Ein Fehler ist aufgetreten, in der Nähe und Ausfahrt
ClientSocket.Close;
Beenden;
end;
end;
end;
Wenn die Verbindung hergestellt wurde, wird der Thread muss warten, für eingehende Daten. Sie können diesen Code zu warten, für die Daten:
if (nicht beendet) und
(Nicht fSocketStream.WaitForData (1000000)) dann
beginnen
/ / Handle die Timeout -
end;
/ / Es gibt eingehenden Daten über die Steckdose!
Zum Lesen von Daten, sollten Sie einen Puffer um die Daten zu speichern in. In der Regel wird der Puffer ist ein PByteArray oder ein Array von Zeichen. In diesem Beispiel habe ich einen Puffer fRequest genannt, die ein Array von Zeichen. Außerdem erwarte ich eine feste Anzahl von Bytes. Mein Array hat die Größe der Konstanten REQUESTSIZE.
var
ac, readlen: integer;
beginnen
FillChar (fRequest, REQUESTSIZE, 0);
AC: = 0;
wiederholen
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);
end;
Wenn readlen 0 ist, dann bin ich keine weiteren Daten. Die Funktion Lesen Sie mal nach 100.000 miliseconds wie in der TWinSocketStream.Create (). Wenn Sie nicht wissen, wie viele Daten zu erwarten, sollten Sie diese Timeout recht gering sein. 30 Sekunden sollte maximal in den meisten Situationen.
Wenn Sie eine Antwort, sollte Ihnen bewusst sein, der Ihre Kunden Verhalten. Viele Kunden nur wartet auf ein Paket von Antwort, andere erwartet, viele Pakete.
In diesem Beispiel habe ich ein Client erwartet, dass nur ein Paket, so habe ich schicke ich meine Daten wieder in ein Stück:
fSocketStream.WriteBuffer (fRep, fReplySize);
Die fRep ist die Antwort der Puffer, und fReplySize ist die Größe des replybuffer.

Delicious
Digg
Google
Yahoo