Cette lettre a été posté à l'origine delphi3000.com

La documentation sur le Delphi TServerSocket capacités de multithreading peut paraître un peu clairsemée pour l'œil mal. Je vais essayer de jeter un peu plus de lumière sur le sujet.

En fait, c'est assez facile de faire un multi-serveur qui écoute les messages sur un socket. Delphi est un composant de ce qui suit: le TServerSocket.

Mais vous avez besoin d'un peu de connaissances pour l'utiliser.

Afin de structurer votre travail, vous devez:

- Ajouter un TServerSocket à votre formulaire principal.
- Réglez le ServerType propriété stThreadBlocking
- Créer une nouvelle unité (voir ci-dessous) contenant le serveur fil.


Faites le code suivant sur la OnSocketGetThread

procédure TfrmMain.fSocketGetThread (Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
commencer
/ / Cela crée l'objet TServerThread J'ai montré
/ / Dans le code ci-dessous. Un objet est créé à chaque fois
/ / Une nouvelle connexion est établie.
SocketThread: = TServerThread.Create (FALSE, ClientSocket);
fin;

Le TServerThread est un objet que j'ai créé moi-même. L'objet inheits de TServerClientThread et contient le code qui en réalité sont la lecture et l'écriture de la prise.

L'unité que j'ai créé contient au moins le code suivant:

serverthread unité;

interface

utilise
fenêtres, scktcomp, sysutils, Classes, les formes;

type
EServerThread = class (Exception);
/ / Le serverthread est un descendant de la
/ / TServerClientThread
TServerThread = class (TServerClientThread)
privé
fSocketStream: TWinSocketStream;
public
procédure ClientExecute; override;
/ / Le ClientExecute l'emporte sur la
/ / TServerClientThread.ClientExecute
/ / Et contient le code qui est
/ / Exécuté quand le fil est lancé
fin;

la mise en œuvre

TServerThread.ClientExecute procédure;
commencer
hérité FreeOnTerminate: = TRUE;
essayer
fSocketStream: = TWinSocketStream.Create (ClientSocket,
100000);
/ / 100000 est le délai en millisecondes.
essayer
while (non terminé) et (ClientSocket.Connected) ne
essayer
/ / C'est là que vous allez faire le
/ / En attente pour l'entrée, à la lecture et l'écriture
/ / Les exemples ci-dessous montre ce que vous pouvez
/ / Mettez ici.
sauf sur e: exception do
commencer
/ / Une erreur s'est produite, à proximité et à la sortie
ClientSocket.Close;
Terminate;
fin;
fin;
enfin
fSocketStream.Free;
fin;
sauf sur e: exception do
commencer
/ / Une erreur s'est produite, à proximité et à la sortie
ClientSocket.Close;
Terminate;
fin;
fin;
fin;

Lorsque la connexion est établie, le thread a besoin d'attendre pour les données. Vous pouvez utiliser ce code pour attendre les données:

if (pas Abrogé) et
(Non fSocketStream.WaitForData (1000000)) puis
commencer
/ / Handle de la temporisation
fin;
/ / Il existe des données sur le socket!

Pour lire les données, vous devez disposer d'un buffer pour stocker les données in Généralement la zone tampon est une PByteArray ou d'un tableau de caractères. Dans cet exemple, j'ai une mémoire tampon appelée fRequest qui est un tableau de caractères. Par ailleurs j'attends un nombre fixe d'octets. Mon tableau a la taille de la constante REQUESTSIZE.

var
ac, readlen: integer;
commencer
FillChar (fRequest, REQUESTSIZE, 0);
ac: = 0;
répéter
readlen: = fSocketStream.Read (fRequest [ac],
1024);
/ / J'ai lu dans des morceaux de 1024 octets de la mémoire tampon jusqu'à ce que
/ / Est pleine
ac: = ac + readlen;
jusqu'à ce que (readlen = 0) ou (ac = REQUESTSIZE);
fin;

Si readlen est 0, alors je ne reçois pas plus de données. La fonction Lire fois après 100.000 miliseconds comme indiqué dans le TWinSocketStream.Create (). Si vous ne savez pas combien de données à attendre, vous devriez mettre ce temps assez réduit. 30 secondes devrait être un maximum dans la plupart des situations.

Lors de l'envoi d'une réponse, vous devriez être conscient de vos clients comportement. Beaucoup de clients seulement attend un paquet de réponse, compte de nombreux autres paquets.
Dans cet exemple, j'ai un client qui ne s'attend à un paquet, je dois donc envoyer mes données dans un seul morceau:

fSocketStream.WriteBuffer (FREP, fReplySize);

Le FREP est la réponse de tampon, et fReplySize est la taille de la replybuffer.

Average rating: