// Projeto: Exemplo de Servidor Socket para simular um
Gerenciador de Banco de Dados
// Descrição: O Servidor instância uma lista de strings, e
recebe solicitações
// : de
Cliente para Inserir, Excluir ou Listar.
// Desenvolvedor: Alberto Henrique Sousa
// Faculdade: Facthus - Talentos Humanos
// Curso: Sistemas de Informação
// Disciplinas: Redes de Computadores II
// Professor: Diovani Milhorim
// Data: 23/08/2007
unit Princ;
interface
uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Sockets, ScktComp,
ExtCtrls;
type
TFormPrincipal = class(TForm)
ServerSocket1: TServerSocket; // Componente
servidor "Socket"
Panel1: TPanel;
Edit1: TEdit;
Label1: TLabel;
Log: TMemo;
Button1: TButton;
procedure ServerSocket1ClientRead(Sender:
TObject;
Socket: TCustomWinSocket);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var
Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
List: TStringList; // Lista para armazenamento de Strings
procedure Status;
procedure MsgLog(S: String);
procedure AnalisaSolicitacao(S: String);
public
{ Public declarations }
end;
var
FormPrincipal:
TFormPrincipal;
implementation
{$R *.dfm}
// Package: dclsocket70.bpl
procedure TFormPrincipal.AnalisaSolicitacao(S: String); //
Método para Análise das Solicitações
var
// enviadas pelo Cliente
Comando, Msg:
String;
P: Integer;
Sucesso: Boolean;
begin
Sucesso := False;
MsgLog('Solicitação:
'+S);
Comando := TrimLeft(S);
if LowerCase(Trim(S)) = 'select' then //
Comando Select
begin
Msg := '';
for P:=0 to List.Count-1 do
Msg := Msg + '['+ IntTostr(P+1) + '] ' +
List[P] + ' ';
ServerSocket1.Socket.Connections[0].SendText(Msg); // Envia uma mensagem para o cliente
Sucesso :=
True;
// Envia todos registros cadastrado na lista
end
else if LowerCase(Copy(Comando, 01, 07)) =
'insert ' then // Comando Insert
begin
List.Add(Copy(Comando, 08, Length(Comando))); // Inseri nova String na
Lista
Sucesso := True;
end
else if LowerCase(Copy(Comando, 01, 07)) =
'delete ' then // Comando Delete
begin
P := StrToIntDef(Copy(Comando, 08,
Length(Comando)), 0);
Dec(P);
if (P > -1) and (P < List.Count) then
begin
List.Delete(P); // Deleta
String da Lista, o comando possui um parâmetro
Sucesso :=
True; // para indicar a posição do
registro a ser deletado
end;
end;
if Sucesso then
Msg := 'Sucesso.'
else
Msg := 'Falha!';
MsgLog(Msg);
ServerSocket1.Socket.Connections[0].SendText(Msg); // Envia uma mensagem
para o cliente
end;
// com a mensagem de Sucesso ou Falha.
procedure
TFormPrincipal.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
// O Método
"ClientRead" faz a leitura da mensagem enviada pelo cliente através
// da propriedade
"ReceiveText" do componente "TCustomWinSocket".
AnalisaSolicitacao(Socket.ReceiveText);
end;
procedure TFormPrincipal.FormShow(Sender: TObject);
begin
Button1Click(Self);
end;
procedure TFormPrincipal.FormClose(Sender: TObject;
var Action:
TCloseAction);
begin
// Desativa Servidor
ao fechar
ServerSocket1.Active
:= False;
end;
procedure TFormPrincipal.Status;
begin
if
ServerSocket1.Active then // Status do Servidor
begin
Button1.Caption :=
'Stop';
MsgLog('Servidor
Conectado...');
end
else
begin
Button1.Caption :=
'Start';
MsgLog('Servidor
Desconectado...');
end;
end;
procedure TFormPrincipal.MsgLog(S: String);
begin
Log.Lines.Add(S);
Application.ProcessMessages;
end;
procedure TFormPrincipal.Button1Click(Sender: TObject);
begin
List.Clear;
if not
ServerSocket1.Active then
ServerSocket1.port
:= StrToIntdef(Edit1.text, 0); // Define a porta de conexão
ServerSocket1.Active
:= not ServerSocket1.Active; // Ativa/Desativa conexão
Status;
end;
procedure TFormPrincipal.FormCreate(Sender: TObject);
begin
List :=
TStringList.Create; // Instância a Lista
end;
procedure TFormPrincipal.FormDestroy(Sender: TObject);
begin
List.Free; // Remove a Lista da Memória
end;
end.