Jump to content
Marcos melo sales

Como conectar um aplicativo cliente ao servidor, passando por um terceiro aplicativo hospedado em um VPS (Virtual Private Server)?

Recommended Posts

Eu tenho um aplicativo cliente> servidor, onde são estabelecidas conexões usando componentes Socket ( TClientSocketdo cliente se conecta ao TServerSocketservidor). Agora, desejo que os clientes se conectem primeiro a um terceiro aplicativo (um tipo de "ponte de conexão" ou "repetidor") que será executado em um Windows VPS e deve direcionar essas conexões dos clientes para o aplicativo do servidor em execução no servidor pc. Exemplo: 

5lUou.png

 

 

Provavelmente (não tenho certeza) esse tipo de "ponte de conexão" ou "repetidor" que será executado no VPS pode ser semelhante ao aplicativo de servidor que será executado no servidor pc, mas não sei como conectar e fazer o gerenciamento da conexão / desconexão e o envio / recebimento de dados entre esses três aplicativos. Alguém poderia me dizer como isso pode ser feito de uma maneira simples e, se possível, também fornecer um exemplo de código sobre isso?

Abaixo segue o código do cliente e servidor (servidor que será executado no servidor pc), isso é tudo o que tenho até agora.

 

 

 

Cliente:

uses
  ScktComp;

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    Timer1: TTimer;
    Label1: TLabel;
    procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Connecting(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure Timer1Timer(Sender: TObject);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
  Label1.Caption := 'CONNECTED';
end;

procedure TForm1.ClientSocket1Connecting(Sender: TObject; Socket: TCustomWinSocket);
begin
  Label1.Caption := 'CONNECTING...';
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  Label1.Caption := 'DISCONNECTED';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if not ClientSocket1.Active then
    ClientSocket1.Active := true;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  ErrorCode := 0;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  s: string;
begin
  s := Socket.ReceiveText;
  if s = 'CMD' then
    Socket.SendText('Hello, here is Client: ' + Socket.LocalHost + '!');
end;

end.

Servidor:

uses
  ScktComp;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    ServerSocket1: TServerSocket;
    PopupMenu1: TPopupMenu;
    SON: TMenuItem;
    SOFF: TMenuItem;
    SCMD: TMenuItem;
    procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure SONClick(Sender: TObject);
    procedure SOFFClick(Sender: TObject);
    procedure SCMDClick(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
  Item: TListItem;
begin
  Item := ListView1.Items.Add;
  Item.Caption := IntTostr(Socket.Handle);
  Item.SubItems.Add(Socket.RemoteAddress);
  Item.SubItems.Add(Socket.RemoteHost);
  Item.Data := Socket.Data;
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
  Item: TListItem;
begin
  Item := ListView1.FindCaption(0, inttostr(Socket.Handle), false, true, false);
  if Item <> nil then
    Item.Delete;
end;

procedure TForm1.ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  ErrorCode := 0;
end;

procedure TForm1.SONClick(Sender: TObject);
begin
  ServerSocket1.Active := true;
end;

procedure TForm1.SOFFClick(Sender: TObject);
begin
  ServerSocket1.Active := false;
end;

procedure TForm1.SCMDClick(Sender: TObject);
begin
  if ListView1.Selected = nil then
    exit;
  ServerSocket1.Socket.Connections[ListView1.ItemIndex].SendText('CMD');
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  s: string;
begin
  s := Socket.ReceiveText;
  if s <> '' then
    ShowMessage(s);
end;

end.

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By ronaldobgomes
      Boa tarde galera
      Tenho um problema que preciso resolver, seguinte:
      tenho um banco de dados e nele contem uma tabela chamada agencia, ela esta funcionando legal mas NÃO consegui montar um filtro legal pra ela,
      a tabela é de agencias bancarias,  chama-se Bancoage, os campos de pesquisa são Bancod e Agenum
      o editbanco.text busca só  banco , exemplo: '237'.O editagencia.text busca só agencias, exemplo: '0522' e os dois edit teria que pesquisar banco agencia, 
      banco - agencia  - 
      237         0522
      este comando eu quero usar nas pesquisas e também pra verificar se ja existe a agencia cadastrada.
      meu filtro só faz em um edit só, me ajudem por favor.
      Uso UniSql, delphi 10.3 e que fique claro eu estou desenvolvendo um programa para empresas de cobrancas e esta base alimenta o cadastro de cheques
       
      Valew!!!!!
    • By juniorpinheiro
      Olá bom dia a todos, tenho um software que desenvolvi para emissoras de rádio, em meu computador funciona perfeitamente, mas quando testo em um computador básico de trabalho, ele dá erros na qual verifiquei que influencia na pasta as permissões, pois por exemplo, uso arquivo ini, e se não der permissão na pasta de escrita ele dá erro, e também criação de logs de erros em txt.
      Só que se eu instalar meu programa em um computador normal gera erros, então a pergunta afinal, como resolver isso?
      Meu software está sendo desenvolvido em Delphi para versão 32bits.
      Obrigado a todos.
    • By Geraldo lacerda
      Ola pessoal.. sou inciante em delphi mobile e estou com a seguinte situação:
      tenho 3 listview que recebe dados via rest de um site PHP
      usando restCliente, RestREquest e restResponse...
      os dados recebe certim, popula alistvew tudo corretamente, compila também tudo normal.... o problema vem a seguir.....
      no rest tem um campo imagem (jpg,png) somente a url da imagem,
      uso esta função para converter a imagem em Bitmap

      function TfrmPrincipal.LerImage(url: string): TBitmap;  var  strm : TmemoryStream;  begin     strm := TMemoryStream.Create;     try           http.Get(url,strm);           strm.Position := 0;           Result  := TBitmap.Create;           result.Width := 100;           result.Height := 50;           result.LoadFromStream(strm);     finally       strm.Free;     end;  end;

      porem quando coloco na listview esta imagem o aplicativo trava (para de responder..... uso desta forma no listview
      alguem me dá uma luz como resolver isso??
       
    • By xdxddxd
      olá pessoal se puderem tirar essa minha duvida rápidinho eu agradeço.
      ainda tem como usar o font awesome por link invés de manter ele na maquina local ? se sim, podem me passar o link ?
      estou fazendo uma aplicação delphi usando o lazarus e o raudus, porem ainda não sei muito bem como referenciar um item local por isso quero puxar as coisas direto de seus devidos servidores.
      obrigado pela atenção.
    • By 100rafael61
      Então queria saber se é possível fazer a conexão entre o Delphi e uma Impressora Não Fiscal (uma simples)?
       
      É que estou desenvolvendo um programa em Delphi, e minha ideia era que através de um button, fosse impresso algo que está escrito em um DBEdit (Pode ser outro componente editável, desde que seja BD, pois estou mexendo com banco).
       
      E não tenho ideia de como desenvolver um código para que isto ocorra, se alguém souber e puder ajudar, agradeço. Estou realmente precisando.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.