Delphi Indy 10 TCP客户端服务器-开放通信通道测试
我正在修改一个Indy10 TCP/IP应用程序,我想听听您对实现客户端功能的建议/意见/示例代码,该功能可以执行以下操作 a) 在启动应用程序时,当显示启动屏幕时,它将验证客户端计算机是否可以访问internet,TCP服务器是否已启动并正在运行,以及是否正在等待通信。如果不是这样,应用程序应该终止 b) 在客户端和服务器之间进行任何数据交换之前,是否执行上述(a)项 此外,服务器是否需要反复广播某种消息,以通知潜在客户它已启动并正在运行 感谢您的帮助。如何验证是否可以连接到TCP服务器? 关于你的第一个问题;一定要将连接尝试包装到一个单独的线程,在启动屏幕显示时运行该线程。在该线程中,您可以简单地尝试捕获异常。如果引发异常,则连接失败。如果没有,您可以连接。对于有关此状态的通知,我将使用自定义消息,您将发送到一个启动屏幕表单,如以下伪代码所示:Delphi Indy 10 TCP客户端服务器-开放通信通道测试,delphi,tcp,ping,lazarus,indy10,Delphi,Tcp,Ping,Lazarus,Indy10,我正在修改一个Indy10 TCP/IP应用程序,我想听听您对实现客户端功能的建议/意见/示例代码,该功能可以执行以下操作 a) 在启动应用程序时,当显示启动屏幕时,它将验证客户端计算机是否可以访问internet,TCP服务器是否已启动并正在运行,以及是否正在等待通信。如果不是这样,应用程序应该终止 b) 在客户端和服务器之间进行任何数据交换之前,是否执行上述(a)项 此外,服务器是否需要反复广播某种消息,以通知潜在客户它已启动并正在运行 感谢您的帮助。如何验证是否可以连接到TCP服务器? 关
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地址、端口号)甚至其他信息(例如状态)
使用Internet Direct(Indy)UDP组件很容易实现服务器端和客户端
以下是Delphi针对开放源码消息代理Apache ActiveMQ的IP多播示例,包含完整的源代码:
我对b)你的意思是在发送命令之前是否需要检查连接?我们可以在哪里下载此精确性?@EASI感谢你的夸奖:)文章中包含了完整的应用程序代码(我已更新了指向Indy 10.6版本的链接,该版本与XE4兼容)