Esta carta fue originalmente publicado en delphi3000.com
La documentación de Delphi en la TServerSocket la capacidad de multithreading puede parecer un poco escasa para el ojo inexperto. Voy a tratar de arrojar un poco más de luz sobre el tema.
En realidad es bastante fácil hacer un multi-servidor en el que la escucha de los mensajes en un socket. Delphi tiene un componente para ello: la TServerSocket.
Sin embargo, usted necesita un poco de conocimiento para utilizarlo.
Con el fin de estructurar su trabajo, usted debe:
- Añadir un TServerSocket a su formulario principal.
- Establece la propiedad Servertype a stThreadBlocking
- Crear una nueva unidad (que se muestra a continuación) que contiene el servidor de hilo.
Haga el siguiente código en la OnSocketGetThread
procedimiento TfrmMain.fSocketGetThread (Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
empezar
/ / Esto crea el objeto TServerThread me han demostrado
/ / En el código de más abajo. Un nuevo objeto se crea cada vez
/ / Una nueva conexión está establecida.
SocketThread: = TServerThread.Create (FALSE, ClientSocket);
final;
El TServerThread es un objeto que he creado a mí mismo. El objeto inheits de TServerClientThread y contiene el código que realmente son la lectura y la escritura desde el zócalo.
La unidad que he creado contiene, al menos, el siguiente código:
serverthread unidad;
interfaz
usos
ventanas, scktcomp, SysUtils, clases, formas;
tipo
EServerThread = class (Exception);
/ / La serverthread es un descendiente de la
/ / TServerClientThread
TServerThread = class (TServerClientThread)
privado
fSocketStream: TWinSocketStream;
público
ClientExecute procedimiento; override;
/ / La ClientExecute anula el
/ / TServerClientThread.ClientExecute
/ / Y contiene el código real que se
/ / Ejecutará cuando el hilo se inicia
final;
aplicación
TServerThread.ClientExecute procedimiento;
empezar
heredado FreeOnTerminate: = True;
intentar
fSocketStream: = TWinSocketStream.Create (ClientSocket,
100000);
/ / 100000 es el tiempo de espera en milisegundos.
intentar
while (no terminado) y (ClientSocket.Connected) hacer
intentar
/ / Este es el lugar donde se hará el real
/ / Espera para la entrada, la lectura y la escritura
/ / Los ejemplos a continuación muestra lo que puede
/ / Ponga aquí.
salvo el correo-e: hacer excepción
empezar
/ / Se ha producido un error, cerrar y salir
ClientSocket.Close;
Finaliza;
final;
final;
finalmente
fSocketStream.Free;
final;
salvo el correo-e: hacer excepción
empezar
/ / Se ha producido un error, cerrar y salir
ClientSocket.Close;
Finaliza;
final;
final;
final;
Cuando se establece la conexión, el hilo tiene que esperar a los datos. Puede utilizar este código para esperar a los datos:
if (no terminado) y
(No fSocketStream.WaitForData (1000000)) entonces
empezar
/ / Manejar el tiempo de
final;
/ / No son los datos sobre el zócalo!
Para leer los datos, usted debe tener un buffer para almacenar los datos pulgadas Normalmente, el tampón es un PByteArray o un conjunto de caracteres. En este ejemplo he llamado un buffer fRequest que es un conjunto de caracteres. Además estoy esperando un número fijo de bytes. Mi serie tiene el tamaño de la constante REQUESTSIZE.
var
AC, readlen: integer;
empezar
FillChar (fRequest, REQUESTSIZE, 0);
AC: = 0;
repetir
readlen: = fSocketStream.Read (fRequest [AC],
1024);
/ / He leído en trozos de 1024 bytes hasta que el buffer
/ / Está llena
AC: = ac + readlen;
hasta que (readlen = 0) o (AC = REQUESTSIZE);
final;
Si readlen es 0 entonces no recibir más datos. La función Leer el tiempo de espera después de 100000 milisegundos como se indica en el TWinSocketStream.Create (). Si usted no sabe cuánto esperar a los datos, debe establecer este tiempo bastante pequeño. 30 segundos debería ser una máxima en la mayoría de las situaciones.
Al enviar una respuesta, usted debe ser consciente de su comportamiento de los clientes. Muchos clientes sólo espera por un paquete de respuesta, espera que muchos otros paquetes.
En este ejemplo, tengo un cliente que sólo espera un paquete, por lo que tengo que enviar mis datos en un fragmento:
fSocketStream.WriteBuffer (FREP, fReplySize);
El FREP es la respuesta de amortiguación, y fReplySize es el tamaño de la replybuffer.

Delicious
Digg
Google
Yahoo