当我使用TServerSocket时,我可以使用属性Data
来存储指向类的指针,例如每个客户端。
现在我将使用Indy TIdCmdTCPServer,我想知道是否有相同的属性。
答案 0 :(得分:1)
是的,有TIdContext.Data
属性。在TIdCmdTCPServer
个参数中,TIdCommand
参数而不是TIdContext
参数,您可以从TIdContext
属性访问TIdCommand.Context
对象。例如:
type
TMyClass = class
// add whatever you need...
end;
procedure TForm1.IdCmdTCPServer1Connect(AContext: TIdContext);
var
MyCls: TMyClass;
begin
MyCls := TMyClass.Create;
// initialize MyCls as needed...
AContext.Data := MyCls;
end;
procedure TForm1.IdCmdTCPServer1Disconnect(AContext: TIdContext);
begin
AContext.Data.Free;
AContext.Data := nil;
end;
procedure TForm1.IdCmdTCPServer1CommandHandlerCommand(ACommand: TIdCommand);
var
MyCls: TMyClass;
begin
MyCls := TMyClass(ACommand.Context.Data);
// use MyCls as needed...
end;
Indy还有另一个有用的功能。您可以从TIdServerContext
派生自定义类,添加您想要的任何内容,然后在激活服务器之前将其分配给服务器的ContextClass
属性。这样,当您需要访问自定义成员时,您可以简单地将任何TIdContext
指针强制转换为您的类类型。例如:
type
TMyContext = class(TIdServerContext)
public
// add whatever you need...
constructor Create(AConnection: TIdTCPConnection; AYarn: TIdYarn; AList: TIdContextThreadList = nil); override;
destructor Destroy; override;
end;
constructor TMyContext.Create(AConnection: TIdTCPConnection; AYarn: TIdYarn; AList: TIdContextThreadList = nil);
begin
inherited;
//...
end;
destructor TMyContext.Destroy;
begin
//...
inherited;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
IdCmdTCPServer1.ContextsClass := TMyContext;
end;
procedure TForm1.IdCmdTCPServer1Connect(AContext: TIdContext);
var
MyCtx: TMyContext;
begin
MyCtx := TMyClass(AContext);
// initialize MyCtx as needed...
end;
procedure TForm1.IdCmdTCPServer1CommandHandlerCommand(ACommand: TIdCommand);
var
MyCtx: TMyContext;
begin
MyCtx := TMyClass(ACommand.Context);
// use MyCtx as needed...
end;
这样,当您可以使用服务器已经为您创建的类时,您不需要浪费时间和内存为每个客户端分配一个单独的类。