Como conectar um aplicativo cliente ao servidor, passando por um terceiro aplicativo hospedado em um VPS (Virtual Private Server)?
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:
/applications/core/interface/imageproxy/imageproxy.php?img=https://i.stack.imgur.com/5lUou.png&key=7c7df41e79d6a87097cfc1c02ccffc50b95ab197cc4f0a05017852db2ecbee5b" width="736" data-imageproxy-source="https://i.stack.imgur.com/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.
Discussão (0)
Carregando comentários...