Socket Assíncrono

Delphi

16/01/2008

Pessoal,

Alguém sabe ou tem material a respeito do que é um socket assíncrono e para serve.

Tem alguém que me pediu para fazer um software utilizando socket assíncrono, mas estou em dúvida a respeito.

Se alguém puder me ajudar desde já agradeço.


Lucaoliveira

Lucaoliveira

Curtidas 0

Respostas

Massuda

Massuda

16/01/2008

Basicamente você deve usar os componentes TClientSocket e TServerSocket que vem com o Delphi (dependendo da versão do Delphi, os nomes podem ser ligeiramente diferentes). Não trablaho com esses componentes, mas acredito que outros colegas do fórum podem te dar mais informações.


GOSTEI 0
Lucaoliveira

Lucaoliveira

16/01/2008

O que vc quer dizer que estes componentes(TClientSocket e o TServerSocket) que vc citou já são assíncronos por padrão?


GOSTEI 0
Massuda

Massuda

16/01/2008

Sim, internamente eles usam sockets assincronos.


GOSTEI 0
Marcal

Marcal

16/01/2008

Amigos bom eu ja passei por algumas esperiencias com Socket ja tenho aplicações rodando blzinha mais confesso q ainda falta muito pra ficar 100¬ bom mais deixa tentar te esplicar e ver se era isso mesmo q era a duvida sua:
Eu Utilizo os Componentes TServerSocket, ClienteServerSocket D7 os quais se for pra versao 2005 do delphi vc terar q migrar para os INDY. para monitorar as Conexoes TCP-IP.
O Funcionamento deles e basicamente o Seguinte: Vc usa um Server Socket para receber as conexoes dos ClienteSocket, Lembra um detalhe o seguinte:
Vc Define qual porta Ip ira trabalhar ai vc tera q fazer uma função para monitorar as conexoes pois vc irar enviar e receber daods correto (assincrone). Bom vou colocar um exemplo baisoc em baixo ai vou comentando ai acho q fica melhor pra vc entender:


//No Componente tServerSocket
procedure TDM.ServidorClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var Numero : Integer;

begin
   //Um Pouco da Rotina para vc monitorar os Socket pois depois irei tirar a parte mais complicada de trabalhar com Socket
  I := 0;
  New(IDSocket); 
  Socket.Data := IDSocket; 
  Conexao.Add(Socket.data); 

end;

procedure TDM.ServidorClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var NumeroConexao, I : Integer;
begin

   Try
     NumeroConexao := StrToInt(qryPesqConexaoNumeroSocket.value);
   except
     On EconvertError do

   end;

   With qryDelConexao do
   Begin
     Close;
     Params[0].value := IntToStr(NumeroConexao);
     ExecSQL;
   end;

   //Aki eu coloco a torina para subir ou descer os socket tem uma mais completa so q nao ta aki comigo e ela e bem estensa depois eu posto pra vc se vc quiser

   glbAberto := False;
    If Socket.Data <> nil Then
    begin
      NumConex := Conexao.IndexOf(Socket.Data);
      Conexao.Remove(Socket.Data);
      Dispose(Socket.Data);
    end;

end;

procedure TDM.ServidorClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
   //Para nao deixar aparecer as msg do Windows pq se aparecer fica travado ate dar um Enter em OK
   errorCode := 0;
end;

procedure TDM.ServidorClientRead(Sender: TObject;
  Socket: TCustomWinSocket);

begin
 //Aki e a parte principal pq e aki q vc recebe as informações q os clientes estao te enviando eu utilizo um sleep pq minhas conexoes e via PC com Equipamento GPRS ai da um atrazo no envio mais acredito q PC para PC nao precisa usar esse Sleep.

    Sleep(130);
     GlbValor := Socket.ReceiveText; //funcao q vc recebe os valores ai vc depois trata e armazena em tabelas

end;

Bom pra vc mandar os dados do servidor para o cliente vc tem q saber em qual socket ele esta conectado por isso vc vai ter q fazer uma função para amarrar o numero do socket com o pc ou se nao vc envia todos os dados para todos os cliente conectados

Dm.Servidor.Socket.Connections[(NumeroSocket))].SendText(´Teste q ira enviar);



As conexoes trabalha da seguinte forma:
Computadores X,Y,Z e Servidor A

X Conecta em A = Socket 0
Y Conecta em A = Socket 1
Z Conecta em A = Socket 2

Se o Z Desconecta blz fica 0, 1, a proxima conexao tem q ser a de numero 2
volta tudo normal. 0, 1, 2
ai Y desconecta ai fica X = 0, Z = 1, ou seja se cair a conexao do meio ou do inicio elas tem q cair pros sockets de baixo sempre tem q ficar em fila (fila indiana)

Espero q tenho ajudado mais na net tem muitos artigos bons a respeito de socket


GOSTEI 0
POSTAR