À l'aide de la tserversocket composant


Cette lettre a été posté pour delphi3000.com
Delphi documentation sur la TServerSocket de capacités de multithreading peut paraître un peu limité pour l'œil non averti. Je vais essayer de faire un peu de lumière sur le sujet.
en Fait, il est assez facile de faire un serveur multithread qui écoute les messages sur un socket. Delphi est un composant pour: la 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.
- Définir la Servertype propriété stThreadBlocking
- Créer une nouvelle unité (voir ci-dessous) contenant le thread du serveur.

le code suivant sur le OnSocketGetThread
procédure TfrmMain.fSocketGetThread(Sender: TObject
& nbsp & nbsp ClientSocket: TServerClientWinSocket
& nbsp & nbsp var SocketThread: TServerClientThread)
begin
& nbsp & nbsp // Ceci crée la TServerThread objet je l'ai montré,
& nbsp & nbsp // dans le code ci-dessous. Un nouvel objet est créé à chaque fois
& nbsp & nbsp // Une nouvelle connexion est établie.
& nbsp & nbsp SocketThread := TServerThread.Créer des( FAUX, ClientSocket )
fin
Le TServerThread est un objet que j'ai créé moi-même. L'objet inheits de TServerClientThread et contient le code que sont la lecture et l'écriture à partir de la prise.
L'unité, j'ai créé contient au moins le code suivant:
unité de serverthread
interface

& nbsp & nbsp windows, scktcomp, SysUtils, Classes, des Formulaires
type
& nbsp & nbsp EServerThread = classe( Exception )
& nbsp & nbsp // Le serverthread est un descendant de la
& nbsp & nbsp // TServerClientThread
& nbsp & nbsp TServerThread = classe( TServerClientThread )
& ! & ! & ! & nbsp privé
& ! & ! & ! & ! & ! & nbsp fSocketStream : TWinSocketStream
& ! & ! & ! & nbsp public
& ! & ! & ! & ! & ! & nbsp procédure ClientExecute remplacer
& ! & ! & ! & ! & ! & nbsp // Le ClientExecute remplace le
& ! & ! & ! & ! & ! & nbsp // TServerClientThread.ClientExecute
& ! & ! & ! & ! & ! & nbsp // et contient le code qui est
& ! & ! & ! & ! & ! & nbsp // exécutée lorsque le thread est démarré
& nbsp & nbsp fin
application
procédure TServerThread.ClientExecute
begin
& nbsp & nbsp hérité FreeOnTerminate := TRUE
& nbsp & nbsp essayer
& ! & ! & ! & nbsp fSocketStream := TWinSocketStream.Créer( ClientSocket,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp 100000 )
& ! & ! & ! & nbsp // 100000 est le délai d'attente en millisecondes.
& ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & nbsp while ( pas Terminé ) et ( ClientSocket.Connecté ) ne
& ! & ! & ! & ! & ! & nbsp essayer

& ! & ! & ! & ! & ! & ! & ! & nbsp // C'est là que vous allez faire l'
& ! & ! & ! & ! & ! & ! & ! & nbsp // Attente pour l'entrée, La lecture et l'écriture
& ! & ! & ! & ! & ! & ! & ! & nbsp // Les exemples ci-dessous montre ce que vous pouvez
& ! & ! & ! & ! & ! & ! & ! & nbsp // mettre ici.
& ! & ! & ! & ! & ! & nbsp sauf sur e:l'exception ne
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp // Une erreur est survenue, fermez et quittez
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp ClientSocket.Fermer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Résilier
& ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & nbsp enfin
& ! & ! & ! & ! & ! & nbsp fSocketStream.Gratuit
& ! & ! & ! & nbsp fin
& nbsp & nbsp sauf sur e:l'exception ne
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp // Une erreur est survenue, fermez et quittez
& ! & ! & ! & ! & ! & nbsp ClientSocket.Fermer
& ! & ! & ! & ! & ! & nbsp Résilier
& ! & ! & ! & nbsp fin
& nbsp & nbsp fin
fin
Lorsque la connexion est établie, le thread doit attendre pour les données entrantes. Vous pouvez utiliser ce code pour attendre que les données:
if ( non terminé ) et
& nbsp & nbsp & nbsp ( pas fSocketStream.WaitForData( 1000000 ) )
begin
& nbsp & nbsp // Gérer le timeout
fin
// Il y a des données entrantes sur la prise!
Pour lire les données, vous devriez avoir une mémoire tampon pour stocker les données. Habituellement, le tampon est un PByteArray ou un tableau de caractères. Dans cet exemple j'ai un tampon appelé fRequest qui est un tableau de caractères. En outre, je suis dans l'attente d'un nombre fixe d'octets. Mon tableau a la taille de la constante de REQUESTSIZE.
var
& nbsp & nbsp ac, readlen : integer
begin
& nbsp & nbsp FillChar( fRequest, REQUESTSIZE, 0 )
& nbsp & nbsp ac := 0
& nbsp & nbsp repeat
& ! & ! & ! & nbsp readlen := fSocketStream.Lire( fRequest[ac],
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp 1024 )
& ! & ! & ! & nbsp // j'ai lu par blocs de 1024 octets jusqu'à ce que le tampon
& ! & ! & ! & nbsp // est plein
& ! & ! & ! & nbsp ac := ac readlen
& nbsp & nbsp jusqu' ( readlen = 0 ) ou ( ac = REQUESTSIZE )
fin
Si readlen est 0 alors je ne plus recevoir de données. La fonction de Lecture une fois de 100000 milisecondes comme indiqué dans le TWinSocketStream.Create(). Si vous ne savez pas comment beaucoup de données à attendre, vous devez définir ce délai d'attente assez petit. 30 secondes devrait être un maximum dans la plupart des situations.
Lors de l'envoi d'une réponse, vous devez être conscient de vos clients comportement. De nombreux clients n'attend qu'un paquet de réponse, d'autres s'attend à beaucoup de paquets.
Dans cet exemple, j'ai un client qui ne prévoit qu'un seul paquet, donc je dois envoyer mes données dans un bloc:
fSocketStream.WriteBuffer( fRep, fReplySize )
Le fRep est la réponse de la mémoire tampon, et fReplySize est la taille de la replybuffer.









A l'aide de la tserversocket composant


A l'aide de la tserversocket composant : Plusieurs milliers de conseils pour vous faciliter la vie.


Cette lettre a ete poste pour delphi3000.com
Delphi documentation sur la TServerSocket de capacites de multithreading peut paraître un peu limite pour l'œil non averti. Je vais essayer de faire un peu de lumiere sur le sujet.
en Fait, il est assez facile de faire un serveur multithread qui ecoute les messages sur un socket. Delphi est un composant pour: la TServerSocket.
Mais vous avez besoin d'un peu de connaissances pour l'utiliser.
afin de structurer votre travail, vous devez:
- Ajouter un TServerSocket a votre formulaire principal.
- Definir la Servertype propriete stThreadBlocking
- Creer une nouvelle unite (voir ci-dessous) contenant le thread du serveur.

le code suivant sur le OnSocketGetThread
procedure TfrmMain.fSocketGetThread(Sender: TObject
& nbsp & nbsp ClientSocket: TServerClientWinSocket
& nbsp & nbsp var SocketThread: TServerClientThread)
begin
& nbsp & nbsp // Ceci cree la TServerThread objet je l'ai montre,
& nbsp & nbsp // dans le code ci-dessous. Un nouvel objet est cree a chaque fois
& nbsp & nbsp // Une nouvelle connexion est etablie.
& nbsp & nbsp SocketThread := TServerThread.Creer des( FAUX, ClientSocket )
fin
Le TServerThread est un objet que j'ai cree moi-meme. L'objet inheits de TServerClientThread et contient le code que sont la lecture et l'ecriture a partir de la prise.
L'unite, j'ai cree contient au moins le code suivant:
unite de serverthread
interface

& nbsp & nbsp windows, scktcomp, SysUtils, Classes, des Formulaires
type
& nbsp & nbsp EServerThread = classe( Exception )
& nbsp & nbsp // Le serverthread est un descendant de la
& nbsp & nbsp // TServerClientThread
& nbsp & nbsp TServerThread = classe( TServerClientThread )
& ! & ! & ! & nbsp prive
& ! & ! & ! & ! & ! & nbsp fSocketStream : TWinSocketStream
& ! & ! & ! & nbsp public
& ! & ! & ! & ! & ! & nbsp procedure ClientExecute remplacer
& ! & ! & ! & ! & ! & nbsp // Le ClientExecute remplace le
& ! & ! & ! & ! & ! & nbsp // TServerClientThread.ClientExecute
& ! & ! & ! & ! & ! & nbsp // et contient le code qui est
& ! & ! & ! & ! & ! & nbsp // executee lorsque le thread est demarre
& nbsp & nbsp fin
application
procedure TServerThread.ClientExecute
begin
& nbsp & nbsp herite FreeOnTerminate := TRUE
& nbsp & nbsp essayer
& ! & ! & ! & nbsp fSocketStream := TWinSocketStream.Creer( ClientSocket,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp 100000 )
& ! & ! & ! & nbsp // 100000 est le delai d'attente en millisecondes.
& ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & nbsp while ( pas Termine ) et ( ClientSocket.Connecte ) ne
& ! & ! & ! & ! & ! & nbsp essayer

& ! & ! & ! & ! & ! & ! & ! & nbsp // C'est la que vous allez faire l'
& ! & ! & ! & ! & ! & ! & ! & nbsp // Attente pour l'entree, La lecture et l'ecriture
& ! & ! & ! & ! & ! & ! & ! & nbsp // Les exemples ci-dessous montre ce que vous pouvez
& ! & ! & ! & ! & ! & ! & ! & nbsp // mettre ici.
& ! & ! & ! & ! & ! & nbsp sauf sur e:l'exception ne
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp // Une erreur est survenue, fermez et quittez
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp ClientSocket.Fermer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Resilier
& ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & nbsp enfin
& ! & ! & ! & ! & ! & nbsp fSocketStream.Gratuit
& ! & ! & ! & nbsp fin
& nbsp & nbsp sauf sur e:l'exception ne
& ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp // Une erreur est survenue, fermez et quittez
& ! & ! & ! & ! & ! & nbsp ClientSocket.Fermer
& ! & ! & ! & ! & ! & nbsp Resilier
& ! & ! & ! & nbsp fin
& nbsp & nbsp fin
fin
Lorsque la connexion est etablie, le thread doit attendre pour les donnees entrantes. Vous pouvez utiliser ce code pour attendre que les donnees:
if ( non termine ) et
& nbsp & nbsp & nbsp ( pas fSocketStream.WaitForData( 1000000 ) )
begin
& nbsp & nbsp // Gerer le timeout
fin
// Il y a des donnees entrantes sur la prise!
Pour lire les donnees, vous devriez avoir une memoire tampon pour stocker les donnees. Habituellement, le tampon est un PByteArray ou un tableau de caracteres. Dans cet exemple j'ai un tampon appele fRequest qui est un tableau de caracteres. En outre, je suis dans l'attente d'un nombre fixe d'octets. Mon tableau a la taille de la constante de REQUESTSIZE.
var
& nbsp & nbsp ac, readlen : integer
begin
& nbsp & nbsp FillChar( fRequest, REQUESTSIZE, 0 )
& nbsp & nbsp ac := 0
& nbsp & nbsp repeat
& ! & ! & ! & nbsp readlen := fSocketStream.Lire( fRequest[ac],
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp 1024 )
& ! & ! & ! & nbsp // j'ai lu par blocs de 1024 octets jusqu'a ce que le tampon
& ! & ! & ! & nbsp // est plein
& ! & ! & ! & nbsp ac := ac readlen
& nbsp & nbsp jusqu' ( readlen = 0 ) ou ( ac = REQUESTSIZE )
fin
Si readlen est 0 alors je ne plus recevoir de donnees. La fonction de Lecture une fois de 100000 milisecondes comme indique dans le TWinSocketStream.Create(). Si vous ne savez pas comment beaucoup de donnees a attendre, vous devez definir ce delai d'attente assez petit. 30 secondes devrait etre un maximum dans la plupart des situations.
Lors de l'envoi d'une reponse, vous devez etre conscient de vos clients comportement. De nombreux clients n'attend qu'un paquet de reponse, d'autres s'attend a beaucoup de paquets.
Dans cet exemple, j'ai un client qui ne prevoit qu'un seul paquet, donc je dois envoyer mes donnees dans un bloc:
fSocketStream.WriteBuffer( fRep, fReplySize )
Le fRep est la reponse de la memoire tampon, et fReplySize est la taille de la replybuffer.


À l'aide de la tserversocket composant

À l'aide de la tserversocket composant : Plusieurs milliers de conseils pour vous faciliter la vie.
Recommander aux amis
  • gplus
  • pinterest

Messages récents

Commentaire

Laisser un commentaire

évaluation