El uso de la tserversocket componente


Esta carta fue originalmente publicado delphi3000.com
El Delphi documentación sobre la TServerSocket las capacidades de subprocesamiento múltiple puede parecer un poco escasa para el ojo inexperto. Voy a intentar arrojar un poco de luz sobre el tema.
en Realidad es bastante fácil hacer un servidor multiproceso que está a la escucha de los mensajes en un socket. Delphi tiene un componente para que: la TServerSocket.
Pero se necesita un poco de conocimiento para utilizarlo.
con el fin De estructurar su trabajo, usted debe:
- Añadir una TServerSocket a su forma principal.
- Establece el Tipo de propiedad a stThreadBlocking
- Crear una nueva unidad (que se muestra a continuación) que contiene el servidor de hilo.

Realizar el siguiente código en el OnSocketGetThread
procedimiento TfrmMain.fSocketGetThread(Sender: TObject
& nbsp & nbsp ClientSocket: TServerClientWinSocket
& nbsp & nbsp var SocketThread: TServerClientThread)
begin
& nbsp & nbsp // Esto crea la TServerThread objeto que me han demostrado
& nbsp & nbsp // en el código de abajo. Se crea un nuevo objeto cada vez
& nbsp & nbsp // Un nuevo establecimiento de la conexión.
& nbsp & nbsp SocketThread := TServerThread.Crear( FALSO, ClientSocket )
fin
La TServerThread es un objeto que he creado a mí mismo. El objeto inheits de TServerClientThread y contiene el código que en realidad son la lectura y la escritura de el encaje.
La unidad que he creado contiene, al menos, el siguiente código:
unidad de serverthread
interfaz
usos
& nbsp & nbsp windows, scktcomp, SysUtils, Classes, Formas
tipo
& nbsp & nbsp EServerThread = clase( Excepción )
& nbsp & nbsp // El serverthread es un descendiente de la
& nbsp & nbsp // TServerClientThread
& nbsp & nbsp TServerThread = clase( TServerClientThread )
& nbsp & nbsp & nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fSocketStream : TWinSocketStream
& nbsp & nbsp & nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp procedimiento ClientExecute reemplazar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // El ClientExecute anula la
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // TServerClientThread.ClientExecute
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // y contiene el código real que se
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // se ejecuta cuando se inicia el subproceso
& nbsp & nbsp final
aplicación
procedimiento TServerThread.ClientExecute
begin
& nbsp & nbsp heredado FreeOnTerminate := TRUE
& nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp fSocketStream := TWinSocketStream.Crear( ClientSocket,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 100000 )
& nbsp & nbsp & nbsp & nbsp // 100000 es el tiempo de espera en milisegundos.
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras ( no Terminado ) y ( ClientSocket.Conectado )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp probar

& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // aquí es donde usted va a hacer el real
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Espera para la entrada, La lectura y la escritura
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Los ejemplos a continuación muestra lo que usted puede
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // poner aquí.
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp excepto en e:exception
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // se ha producido Un error, cerrar y salir
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ClientSocket.Cerrar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Terminar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fSocketStream.Libre
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp excepto en e:exception
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // se ha producido Un error, cerrar y salir
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ClientSocket.Cerrar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Terminar
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
fin
Cuando se establece la conexión, el hilo se debe esperar por los datos entrantes. Usted puede utilizar este código para esperar a los datos:
si ( no Terminado ) y
& nbsp & nbsp & nbsp ( no fSocketStream.WaitForData( 1000000 ) ) entonces
begin
& nbsp & nbsp // controlar el tiempo de espera
fin
// Hay datos entrantes en el zócalo!
Para leer los datos, usted debe tener un buffer para almacenar los datos. Generalmente el búfer es un PByteArray o un array de caracteres. En este ejemplo tengo un buffer llamado fRequest que es un array de caracteres. Además, estoy esperando un número fijo de bytes. Mi matriz tiene el tamaño de la constante REQUESTSIZE.
var
& nbsp & nbsp ac, readlen : integer
begin
& nbsp & nbsp FillChar( fRequest, REQUESTSIZE, 0 )
& nbsp & nbsp ac := 0
& nbsp & nbsp repetir
& nbsp & nbsp & nbsp & nbsp readlen := fSocketStream.Leer( fRequest[ac],
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 1024 )
& nbsp & nbsp & nbsp & nbsp // he leído en bloques de 1024 bytes hasta que el búfer
& nbsp & nbsp & nbsp & nbsp // es completo
& nbsp & nbsp & nbsp & nbsp ac := ac readlen
& nbsp & nbsp hasta ( readlen = 0 ) o ( ac = REQUESTSIZE )
fin
Si readlen es 0 entonces yo no recibir más datos. La función de Lectura después de 100000 milisegundos como se indica en la TWinSocketStream.Create(). Si usted no sabe la cantidad de datos a esperar, debe establecer este tiempo de espera bastante pequeña. 30 segundos debe ser una máxima en la mayoría de las situaciones.
Cuando el envío de una respuesta, usted debe estar consciente de sus clientes de comportamiento. Muchos clientes sólo espera un paquete de respuesta, otros se espera que el número de paquetes.
En este ejemplo, tengo un cliente que sólo espera un paquete, así que tengo que enviar mis datos de nuevo un fragmento:
fSocketStream.WriteBuffer( fRep, fReplySize )
La fRep es la respuesta de amortiguación, y fReplySize es el tamaño de la replybuffer.









El uso de la tserversocket componente


El uso de la tserversocket componente : Multi-millones de consejos para hacer su vida mas facil.


Esta carta fue originalmente publicado delphi3000.com
El Delphi documentacion sobre la TServerSocket las capacidades de subprocesamiento multiple puede parecer un poco escasa para el ojo inexperto. Voy a intentar arrojar un poco de luz sobre el tema.
en Realidad es bastante facil hacer un servidor multiproceso que esta a la escucha de los mensajes en un socket. Delphi tiene un componente para que: la TServerSocket.
Pero se necesita un poco de conocimiento para utilizarlo.
con el fin De estructurar su trabajo, usted debe:
- Añadir una TServerSocket a su forma principal.
- Establece el Tipo de propiedad a stThreadBlocking
- Crear una nueva unidad (que se muestra a continuacion) que contiene el servidor de hilo.

Realizar el siguiente codigo en el OnSocketGetThread
procedimiento TfrmMain.fSocketGetThread(Sender: TObject
& nbsp & nbsp ClientSocket: TServerClientWinSocket
& nbsp & nbsp var SocketThread: TServerClientThread)
begin
& nbsp & nbsp // Esto crea la TServerThread objeto que me han demostrado
& nbsp & nbsp // en el codigo de abajo. Se crea un nuevo objeto cada vez
& nbsp & nbsp // Un nuevo establecimiento de la conexion.
& nbsp & nbsp SocketThread := TServerThread.Crear( FALSO, ClientSocket )
fin
La TServerThread es un objeto que he creado a mi mismo. El objeto inheits de TServerClientThread y contiene el codigo que en realidad son la lectura y la escritura de el encaje.
La unidad que he creado contiene, al menos, el siguiente codigo:
unidad de serverthread
interfaz
usos
& nbsp & nbsp windows, scktcomp, SysUtils, Classes, Formas
tipo
& nbsp & nbsp EServerThread = clase( Excepcion )
& nbsp & nbsp // El serverthread es un descendiente de la
& nbsp & nbsp // TServerClientThread
& nbsp & nbsp TServerThread = clase( TServerClientThread )
& nbsp & nbsp & nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fSocketStream : TWinSocketStream
& nbsp & nbsp & nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp procedimiento ClientExecute reemplazar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // El ClientExecute anula la
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // TServerClientThread.ClientExecute
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // y contiene el codigo real que se
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // se ejecuta cuando se inicia el subproceso
& nbsp & nbsp final
aplicacion
procedimiento TServerThread.ClientExecute
begin
& nbsp & nbsp heredado FreeOnTerminate := TRUE
& nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp fSocketStream := TWinSocketStream.Crear( ClientSocket,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 100000 )
& nbsp & nbsp & nbsp & nbsp // 100000 es el tiempo de espera en milisegundos.
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras ( no Terminado ) y ( ClientSocket.Conectado )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp probar

& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // aqui es donde usted va a hacer el real
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Espera para la entrada, La lectura y la escritura
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Los ejemplos a continuacion muestra lo que usted puede
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // poner aqui.
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp excepto en e:exception
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // se ha producido Un error, cerrar y salir
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ClientSocket.Cerrar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Terminar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fSocketStream.Libre
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp excepto en e:exception
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // se ha producido Un error, cerrar y salir
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ClientSocket.Cerrar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Terminar
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
fin
Cuando se establece la conexion, el hilo se debe esperar por los datos entrantes. Usted puede utilizar este codigo para esperar a los datos:
si ( no Terminado ) y
& nbsp & nbsp & nbsp ( no fSocketStream.WaitForData( 1000000 ) ) entonces
begin
& nbsp & nbsp // controlar el tiempo de espera
fin
// Hay datos entrantes en el zocalo!
Para leer los datos, usted debe tener un buffer para almacenar los datos. Generalmente el bufer es un PByteArray o un array de caracteres. En este ejemplo tengo un buffer llamado fRequest que es un array de caracteres. Ademas, estoy esperando un numero fijo de bytes. Mi matriz tiene el tamaño de la constante REQUESTSIZE.
var
& nbsp & nbsp ac, readlen : integer
begin
& nbsp & nbsp FillChar( fRequest, REQUESTSIZE, 0 )
& nbsp & nbsp ac := 0
& nbsp & nbsp repetir
& nbsp & nbsp & nbsp & nbsp readlen := fSocketStream.Leer( fRequest[ac],
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 1024 )
& nbsp & nbsp & nbsp & nbsp // he leido en bloques de 1024 bytes hasta que el bufer
& nbsp & nbsp & nbsp & nbsp // es completo
& nbsp & nbsp & nbsp & nbsp ac := ac readlen
& nbsp & nbsp hasta ( readlen = 0 ) o ( ac = REQUESTSIZE )
fin
Si readlen es 0 entonces yo no recibir mas datos. La funcion de Lectura despues de 100000 milisegundos como se indica en la TWinSocketStream.Create(). Si usted no sabe la cantidad de datos a esperar, debe establecer este tiempo de espera bastante pequeña. 30 segundos debe ser una maxima en la mayoria de las situaciones.
Cuando el envio de una respuesta, usted debe estar consciente de sus clientes de comportamiento. Muchos clientes solo espera un paquete de respuesta, otros se espera que el numero de paquetes.
En este ejemplo, tengo un cliente que solo espera un paquete, asi que tengo que enviar mis datos de nuevo un fragmento:
fSocketStream.WriteBuffer( fRep, fReplySize )
La fRep es la respuesta de amortiguacion, y fReplySize es el tamaño de la replybuffer.


El uso de la tserversocket componente

El uso de la tserversocket componente : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación