Esta carta foi postada originalmente para delphi3000.com
A documentação sobre o Delphi TServerSocket's multithreading capacidades podem aparecer um pouco escassa para o olho não treinado. Vou experimentar e espalha um pouco mais de luz sobre o assunto.
Na verdade ele é muito fácil de fazer um servidor multithreaded que escuta para mensagens em um soquete. Delphi tem um componente para isso: o TServerSocket.
Mas você precisa de um pouco de conhecimento para utilizá-lo.
A fim de estruturar o seu trabalho, você deve:
- Adicione um TServerSocket a sua principal forma.
- Defina a propriedade Servertype para stThreadBlocking
- Criar uma nova unidade (mostrada abaixo), contendo o servidor de rosca.
Faça o seguinte código no OnSocketGetThread
procedimento TfrmMain.fSocketGetThread (Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
começo
/ / Isso cria o objeto TServerThread tenho mostrado
/ / No código abaixo. Um novo objeto é criado cada vez
/ / A nova conexão é estabelecida.
SocketThread: = TServerThread.Create (FALSO, ClientSocket);
final;
O TServerThread é um objeto criado Tenho meus próprios olhos. O objeto inheits de TServerClientThread e contém o código que, na verdade, estão lendo e escrevendo a partir do soquete.
A unidade contém, pelo menos, eu criei o seguinte código:
serverthread unidade;
interface
utilizações
janelas, scktcomp, SysUtils, Classes, Forms;
tipo
EServerThread = class (Exception);
/ / O serverthread é um descendente do
/ / TServerClientThread
TServerThread = class (TServerClientThread)
privado
fSocketStream: TWinSocketStream;
público
procedimento ClientExecute; override;
/ / O ClientExecute se sobrepõe ao
/ / TServerClientThread.ClientExecute
/ / E contém o código real que é
/ / Executado quando a thread é iniciada
final;
execução
TServerThread.ClientExecute procedimento;
começo
herdou FreeOnTerminate: = TRUE;
tentar
fSocketStream: = TWinSocketStream.Create (ClientSocket,
100000);
/ / 100000 é o tempo em milissegundos.
tentar
enquanto (não Extinto) e (ClientSocket.Connected) fazer
tentar
/ / É aqui que você vai fazer o real
/ / Aguardando a entrada, para ler e escrever
/ / Os exemplos abaixo mostra o que você pode
/ / Coloque aqui dentro.
e, com exceção de: excepção do
começo
/ / Um erro ocorreu, fechar e sair
ClientSocket.Close;
Rescindir;
final;
final;
finalmente
fSocketStream.Free;
final;
e, com exceção de: excepção do
começo
/ / Um erro ocorreu, fechar e sair
ClientSocket.Close;
Rescindir;
final;
final;
final;
Quando a conexão é estabelecida, o segmento tem que esperar por dados recebidos. Você pode usar esse código para esperar por dados:
se (não Extinto) e
(Não fSocketStream.WaitForData (1000000)) então
começo
/ / Manipular o tempo limite
final;
/ / Existem dados recebidos sobre o soquete!
Para ler os dados, você deve ter um buffer para armazenar os dados polegadas Geralmente o buffer é um array da PByteArray ou um Caract. Neste exemplo eu tenho um buffer chamado fRequest que é um array de caracteres. Além disso eu estou esperando um número fixo de bytes. Meu array tem o tamanho da constante REQUESTSIZE.
var
ac, readlen: integer;
começo
FillChar (fRequest, REQUESTSIZE, 0);
ac: = 0;
repetir
readlen: = fSocketStream.Read (fRequest [CA],
1024);
/ / Li, em blocos de 1024 bytes até que o buffer
/ / Está cheio
ac: = ac + readlen;
até (readlen = 0) ou (CA = REQUESTSIZE);
final;
Readlen Se for 0, então eu não receber mais dados. Leia a funcionar após expirar 100000 milissegundos como afirmado na TWinSocketStream.Create (). Se você não sabe quantos dados de esperar, você deve definir o tempo limite bastante pequena. 30 segundo deverá ser, no máximo, em muitas situações.
Quando enviar uma resposta, você deve estar ciente dos seus clientes habituais. Muitos clientes só espera por um pacote de resposta, espera muitos outros pacotes.
Neste exemplo, eu tenho um cliente que só espera um pacote, então eu tenho que mandar meus dados de volta em um naco:
fSocketStream.WriteBuffer (fRep, fReplySize);
O fRep é a resposta tampão, e fReplySize é o tamanho da replybuffer.

Delicious
Digg
Google
Yahoo