Sockets - usando os sockets do Delphi

Top  Previous  Next

{ Sockets completo

 

Instalando os compoentes no Delphi 7

 

 

Para isso vá no menu Component | Install Packages... 

Na janela que ira surgir clique no botão Add... e procure pelo arquivo dclsockets70.bpl. 

De OK e pronto! Os componentes irão aparecer na palleta Internet. 

 

Agora vamos direto ao Assunto

 

  TserverSocket – Este componente como o nome já diz é o SERVIDOR. 

  Ele será responsável por receber as conexões. De quem? Dos TClientSocket! 

  É importante perceber este conceito em que cada TclientSocket conecta a um e somente um servidor. 

  Sempre que você quiser fazer uma comunicação usara no mínimo um Server e um Client 

  (Vamos passar a chamá-los assim OK?) Um outro detalhe super importante é que no caso do servidor ele 

  recebe um integer de conexões.

  

  TclientSocket – Este componente como o nome já diz é o CLIENTE. 

  É com ele que conectamos aos servidores. Pense nele como a janela do seu browser.

  Com ele podemos nos conectar em qualquer servidor. Mas para isso temos que fazer alguns 

  ajustes que veremos a seguir. Por enquanto é importante pegar o conceito de que cada Client se 

  liga somente e diretamente a um Server e o Server poder receber vários Clients. De cara pode 

  surgir a seguinte duvida: Ora, se o client está ligado no servidor como faço para ele falar 

  com outro client ??? Não tem saída meu caro! Sempre vai passar pelo servidor, não há mágica,

  o que vai acontecer que iremos informar ao servidor o destinatário final da mensagem quando

  o servidor receber e “perceber” que a mensagem deve se entregue a outro Client, ele irá enviar

  uma mensagem ao Client correspondente. Isso é o protocolo de comunicação, ele é pessoal e 

  cada um vai implementar como achar melhor.

  

  http://www.activedelphi.com.br/modules.php?op=modload&name=News&file=article&sid=249&mode=thread&order=0&thold=0

  

}

 

 

 

 

--- Form SERVER

 

object ServidorForm: TServidorForm

  Left = 564

  Top = 108

  BorderStyle = bsDialog

  Caption = 'SERVER - [Agente]'

  ClientHeight = 462

  ClientWidth = 320

  Color = clBtnFace

  Font.Charset = DEFAULT_CHARSET

  Font.Color = clWindowText

  Font.Height = -11

  Font.Name = 'MS Sans Serif'

  Font.Style = []

  OldCreateOrder = False

  Position = poScreenCenter

  OnClose = FormClose

  OnCreate = FormCreate

  PixelsPerInch = 96

  TextHeight = 13

  object Memo1: TMemo

    Left = 8

    Top = 8

    Width = 305

    Height = 445

    Color = clBlack

    Font.Charset = DEFAULT_CHARSET

    Font.Color = clYellow

    Font.Height = -11

    Font.Name = 'MS Sans Serif'

    Font.Style = []

    ParentFont = False

    ScrollBars = ssVertical

    TabOrder = 0

  end

  object ServidorSocket: TServerSocket

    Active = False

    Port = 2200

    ServerType = stNonBlocking

    OnClientConnect = ServidorSocketClientConnect

    OnClientDisconnect = ServidorSocketClientDisconnect

    OnClientRead = ServidorSocketClientRead

    Left = 52

    Top = 32

  end

end

 

--- Unit SERVER

 

unit ServidorUnit;

 

interface

 

uses Forms, Classes, Controls, StdCtrls, mLib, ScktComp, SysUtils;

 

type

  TServidorForm = class(TForm)

    Memo1: TMemo;

    ServidorSocket: TServerSocket;

    procedure ServidorSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);

    procedure FormCreate(Sender: TObject);

    procedure ServidorSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);

    procedure ServidorSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

  private

    function LocalizaCliente(Cli: Pointer): Integer;

  public

    IDConexoes: TList;

  end;

 

var

  ServidorForm: TServidorForm;

 

implementation

 

{$R *.dfm}

 

procedure TServidorForm.ServidorSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);

var

  Msg     : String;

  IDCli, I: Integer;

  L       : TStringList;

begin

  Msg := socket.ReceiveText;

 

  // comando que solicita a data/hora do servidor

  if Msg = 'DataHora' then

  Begin

    IDCli := LocalizaCliente(Socket.Data);

    if IDCli >= 0 then

      ServidorSocket.Socket.Connections[IDCli].SendText(mStr.FormataHora(Now));

  end;

 

  // comando Lista pastas

  if mStr.Separa(Msg, ';'1) = 'ListaPasta' then

  Begin

    IDCli := LocalizaCliente(Socket.Data);

    if IDCli >= 0 then

    begin

      L := TStringList.Create;

      mFile.GetFiles(L, mStr.Separa(Msg, ';'2));

      for I := 0 to L.Count-1 do

        ServidorSocket.Socket.Connections[IDCli].SendText(L[I] + '¿');

      L.Free;

    end;

  end;

 

  Memo1.Lines.Add('Recebi de ' + Socket.LocalAddress + ' o comando ' + Msg);

end;

 

procedure TServidorForm.FormCreate(Sender: TObject);

begin

  IDConexoes := TList.Create;

  IDConexoes.Clear;

  // ativa o servidor

  ServidorSocket.Active := True;

end;

 

procedure TServidorForm.ServidorSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);

var

  IDsocket: ^Byte;

begin

 // adiciona o client na lista

 New(IDSocket);

 Socket.Data := IDSocket;

 IDConexoes.Add(Socket.data);

 

 Memo1.Lines.Add('Frente conectou -> ' + Socket.LocalAddress);

end;

 

procedure TServidorForm.ServidorSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);

begin

  Memo1.Lines.Add('Frente desconectou -> ' + Socket.LocalAddress);

  // remove o client da lista

  IDConexoes.Remove(Socket.Data);

  Dispose(Socket.Data);

end;

 

function TServidorForm.LocalizaCliente(Cli: Pointer): Integer;

begin

  Result := IDConexoes.IndexOf(Cli);

end;

 

procedure TServidorForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  IDConexoes.Free;

end;

 

end.

 

================================================================================

 

Form CLIENT

 

object Form1: TForm1

  Left = 337

  Top = 103

  BorderStyle = bsDialog

  Caption = 'CLIENT - [Frente]'

  ClientHeight = 479

  ClientWidth = 473

  Color = clBtnFace

  Font.Charset = DEFAULT_CHARSET

  Font.Color = clWindowText

  Font.Height = -11

  Font.Name = 'MS Sans Serif'

  Font.Style = []

  OldCreateOrder = False

  OnCreate = FormCreate

  PixelsPerInch = 96

  TextHeight = 13

  object ServidorEdit: TAEdit

    Left = 12

    Top = 24

    Height = 21

    TabOrder = 0

    Text = '127.0.0.1'

    EditLabel.Width = 82

    EditLabel.Height = 13

    EditLabel.Caption = 'Servidor [Agente]'

    LabelSize = 0

  end

  object EnviarBtn: TButton

    Left = 12

    Top = 148

    Width = 75

    Height = 25

    Caption = 'Enviar'

    TabOrder = 1

    OnClick = EnviarBtnClick

  end

  object Desconectar: TButton

    Left = 12

    Top = 184

    Width = 75

    Height = 25

    Caption = 'Desconectar'

    TabOrder = 2

    OnClick = DesconectarClick

  end

  object Memo1: TMemo

    Left = 148

    Top = 8

    Width = 321

    Height = 465

    Color = clBlack

    Font.Charset = DEFAULT_CHARSET

    Font.Color = clLime

    Font.Height = -11

    Font.Name = 'MS Sans Serif'

    Font.Style = []

    ParentFont = False

    ScrollBars = ssVertical

    TabOrder = 3

  end

  object ComandoEdit: TACombo

    Left = 12

    Top = 68

    Width = 121

    Height = 21

    CharCase = ecNormal

    Items.Strings = (

      'DataHora'

      'ListaPasta')

    TabOrder = 4

    EditLabel.Width = 45

    EditLabel.Height = 13

    EditLabel.Caption = 'Comando'

  end

  object ParametrosEdit: TAEdit

    Left = 12

    Top = 116

    Height = 21

    TabOrder = 5

    Text = 'C:\*.*'

    EditLabel.Width = 53

    EditLabel.Height = 13

    EditLabel.Caption = 'Parametros'

    LabelSize = 0

  end

  object ClienteSocket: TClientSocket

    Active = False

    ClientType = ctNonBlocking

    Host = '127.0.0.1'

    Port = 2200

    OnDisconnect = ClienteSocketDisconnect

    OnRead = ClienteSocketRead

    OnError = ClienteSocketError

    Left = 224

    Top = 84

  end

end

 

--- Unit CLIENT

 

unit ClienteUnit;

 

interface

 

uses Forms, mLib, Controls, StdCtrls, ACombo, Classes, Mask, AEdit,

  ScktComp;

 

type

  TForm1 = class(TForm)

    ServidorEdit: TAEdit;

    EnviarBtn: TButton;

    Desconectar: TButton;

    Memo1: TMemo;

    ComandoEdit: TACombo;

    ParametrosEdit: TAEdit;

    ClienteSocket: TClientSocket;

    procedure EnviarBtnClick(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure ClienteSocketRead(Sender: TObject; Socket: TCustomWinSocket);

    procedure ClienteSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);

    procedure ClienteSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket);

    procedure DesconectarClick(Sender: TObject);

  private

  public

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.EnviarBtnClick(Sender: TObject);

var

  Comando: string;

begin

  if not ClienteSocket.Active then

  begin

    ClienteSocket.Host   := ServidorEdit.Text;

    ClienteSocket.Active := True;

    mRot.Delay(1000);

  end;

 

  Comando := ComandoEdit.Text;

  if not ParametrosEdit.Vazio then Comando := Comando + ';' + ParametrosEdit.Text;

  ClienteSocket.Socket.SendText(Comando);

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  ComandoEdit.ItemIndex := 0;

end;

 

procedure TForm1.ClienteSocketRead(Sender: TObject; Socket: TCustomWinSocket);

var

  S: string;

  I: Integer;

begin

  S := ClienteSocket.Socket.ReceiveText;

  if Pos('¿', S) > 0 then

  begin

    for I := 1 to mStr.Ocorre(S, '¿') do

      Memo1.Lines.Add(mStr.Separa(S, '¿', I));

  end

  else

    Memo1.Lines.Add(S);

end;

 

procedure TForm1.ClienteSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);

begin

  ErrorCode := 0// abafa erros!?

end;

 

procedure TForm1.ClienteSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket);

begin

  Memo1.Lines.Add('desconectou');

end;

 

procedure TForm1.DesconectarClick(Sender: TObject);

begin

  ClienteSocket.Active := False;

end;

 

end.