繁体   English   中英

Indy 10 TCP客户端服务器 - 测试开放式通信通道

[英]Indy 10 TCP Client Server - testing for open communication channel

我正在修改Indy10 TCP / IP应用程序,我希望您的建议/意见/示例代码实现客户端功能,执行以下操作

a)在显示启动画面时应用程序启动时,它会验证客户端计算机是否具有Internet访问权限,并且TCP服务器已启动并正在运行并等待通信。 如果不是这种情况,应该终止申请。

b)在客户端和服务器之间进行任何数据交换之前,执行上述(a)

此外,服务器是否需要重复广播某种消息以通知潜在客户它已启动并运行?

谢谢你的协助。

如何验证是否可以连接到TCP服务器?

对你的第一个问题; 肯定将连接尝试包装到一个单独的线程,您将在启动屏幕显示时运行该线程。 在该线程中,您只需尝试Connect并捕获异常即可。 如果引发异常,则连接失败。 如果没有,你就可以连接。 对于有关此状态的通知,我将使用自定义消息,您将发送到启动屏幕表单,如下面的伪代码所示:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdTCPClient;

const
  WM_CONNECTION_NOTIFY = WM_USER + 1;
  SC_CONNECTION_FAILURE = 0;
  SC_CONNECTION_SUCCESS = 1;

type
  TConnThread = class(TThread)
  private
    FMsgHandler: HWND;
    FTCPClient: TIdTCPClient;
  protected
    procedure Execute; override;
  public
    constructor Create(const AHost: string; APort: Word; ATimeout: Integer;
      AMsgHandler: HWND); reintroduce;
    destructor Destroy; override;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FConnThread: TConnThread;
    procedure WMConnectionNotify(var AMessage: TMessage); message WM_CONNECTION_NOTIFY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TConnThread }

constructor TConnThread.Create(const AHost: string; APort: Word;
  ATimeout: Integer; AMsgHandler: HWND);
begin
  inherited Create(False);
  FreeOnTerminate := False;
  FMsgHandler := AMsgHandler;
  FTCPClient := TIdTCPClient.Create(nil);
  FTCPClient.Host := AHost;
  FTCPClient.Port := APort;
  FTCPClient.ConnectTimeout := ATimeout;
end;

destructor TConnThread.Destroy;
begin
  FTCPClient.Free;
  inherited;
end;

procedure TConnThread.Execute;
begin
  try
    FTCPClient.Connect;
    PostMessage(FMsgHandler, WM_CONNECTION_NOTIFY, 0, SC_CONNECTION_SUCCESS);
  except
    PostMessage(FMsgHandler, WM_CONNECTION_NOTIFY, 0, SC_CONNECTION_FAILURE);
  end;
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  FConnThread := TConnThread.Create('123.4.5.6', 123, 5000, Handle);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FConnThread.Free;
end;

procedure TForm1.WMConnectionNotify(var AMessage: TMessage);
begin
  case AMessage.LParam of
    // the connection failed
    SC_CONNECTION_FAILURE: ;
    // the connection succeeded
    SC_CONNECTION_SUCCESS: ;
  end;
end;

end.

服务器是否需要重复广播某种消息以通知正在运行的潜在客户端?

不,这可以在不同的方向工作 - 客户端询问服务器是否正在运行。 这就是因为服务器不知道客户端,但客户端知道服务器。

“服务器是否需要重复播放某种消息”

有些系统(服务器,服务)使用IP多播主动向感兴趣的客户通告其位置 (IP地址,端口号)甚至附加信息(例如状态)。

使用Internet Direct(Indy)UDP组件很容易实现服务器端和客户端端。

以下是Delphi的开源消息代理Apache ActiveMQ的IP多播示例,其中包含完整源代码:

使用Delphi XE4和Indy 10.6发现ActiveMQ代理

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM