Ir para conteúdo
Fórum Script Brasil
  • 0

Serversocket Delphi


marcos49ers

Pergunta

4 respostass a esta questão

Posts Recomendados

  • 0

Abra uma Thread para cada cliente no evento onAccept do TServerSocket,

passando o Socket no construtor da Thread.

Com isto você saberá o Socket correspondente a cada cliente conectado, assim como fará processamentos paralelos, não deixando que um cliente espere o processamento do outro.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu jogo os comandos que eu quero dentro do OnAccept do seversocket, pois os comandos que eu quero estao dentro de OnClientRead, os comandos seguem:

S1 := Socket.ReceiveText;

// Envia dados recebidos de volta

ServerSocket.Socket.Connections[0].SendText(S1);

Como faço pra criar um novo thread para cada nova conexao que entra, pois não sei o numero de clientes que conectarão, posso ter por exemplo 2 cliente conectados ao mesmo tempo e mais 4 conectarem.

Link para o comentário
Compartilhar em outros sites

  • 0

Abrindo Threads você não fica mais amarrado no evento onAccept e tb não precisa mais utilizar o evento onClientRead.

Desabilite o evento onClientRead e defina a Thread:

type TSock_Thread = class(TThread)
       private
         Socket :TCustomWinSocket;
       public
         constructor Create(aSocket:TCustomWinSocket);
         procedure   Execute; override;
end;
Na Implementation:
constructor TSock_Thread.Create(aSocket:TCustomWinSocket);
begin
  inherited Create(true); // cria suspensa
  Socket := aSocket; // passa o Socket
  FreeOnTerminate := true; // libera automaticamente
end;

procedure TSock_Thread.Execute;
var s:String;
begin
  While not Terminated and Socket.Connected do
  begin
    if Socket.ReceiveLength > 0 then // evita o evento onClientRead
    begin
      s := Socket.ReceiveText; // recebe
      Socket.SendText(s); // envia
    end;
    Sleep(1); // evita a CPU ficar em 100%
  end;
end;
No evento onAccept:
procedure TForm1.ServerSocket1Accept(Sender: TObject;
  Socket: TCustomWinSocket);
var TST:TSock_Thread;
begin
  TST := TSock_Thread.Create(Socket); // instancia o objeto
  TST.Resume; // coloca a Thread em execução
end;

Notei que você utiliza a propriedade Connections; vale uma dica de que se um Client se desconectar de forma anormal, essa propriedade não é atualizada de imediato.

Link para o comentário
Compartilhar em outros sites

  • 0
Abrindo Threads você não fica mais amarrado no evento onAccept e tb não precisa mais utilizar o evento onClientRead.

Desabilite o evento onClientRead e defina a Thread:

type TSock_Thread = class(TThread)
       private
         Socket :TCustomWinSocket;
       public
         constructor Create(aSocket:TCustomWinSocket);
         procedure   Execute; override;
end;
Na Implementation:
constructor TSock_Thread.Create(aSocket:TCustomWinSocket);
begin
  inherited Create(true); // cria suspensa
  Socket := aSocket; // passa o Socket
  FreeOnTerminate := true; // libera automaticamente
end;

procedure TSock_Thread.Execute;
var s:String;
begin
  While not Terminated and Socket.Connected do
  begin
    if Socket.ReceiveLength > 0 then // evita o evento onClientRead
    begin
      s := Socket.ReceiveText; // recebe
      Socket.SendText(s); // envia
    end;
    Sleep(1); // evita a CPU ficar em 100%
  end;
end;
No evento onAccept:
procedure TForm1.ServerSocket1Accept(Sender: TObject;
  Socket: TCustomWinSocket);
var TST:TSock_Thread;
begin
  TST := TSock_Thread.Create(Socket); // instancia o objeto
  TST.Resume; // coloca a Thread em execução
end;

Notei que você utiliza a propriedade Connections; vale uma dica de que se um Client se desconectar de forma anormal, essa propriedade não é atualizada de imediato.

Deu certo muito obrigado

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...