是否存在等同于TCustomWinSocket.Data的Indy服务器属性?

时间:2015-10-16 14:50:00

标签: sockets delphi indy indy10

当我使用TServerSocket时,我可以使用属性Data来存储指向类的指针,例如每个客户端。

现在我将使用Indy TIdCmdTCPServer,我想知道是否有相同的属性。

1 个答案:

答案 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;

这样,当您可以使用服务器已经为您创建的类时,您不需要浪费时间和内存为每个客户端分配一个单独的类。