结合indy和ics之间的编码

时间:2015-07-24 09:19:15

标签: delphi delphi-xe7

我一直在使用Indy,现在我正在努力解决另一个互联网组件,如 ICS ,并将Indy代码与 ICS 中的相同方法结合起来我开始创建TWSocketserver并开始与客户Twsocket进行沟通我坚持一件事,在indy TIDTCPSERVER我通常使用AContext来定义服务器连接事件上的每个客户端连接例子

TConnection = class(TObject)

    Thread: Pointer;
    end;

    var
      Connection : TConnection;
    begin
    Connection := TConnection.Create;
    Connection.Thread := AContext;
    AContext.Data := Connection;
    end;  

但在TwSocketserver中是不同的参数。

我的问题是可以将上面的代码与 ICS 结合起来,采用相同的方法吗?

我尝试过的事情

procedure Tmainserver.serverClientConnect(Sender: TObject;
  Client: TWSocketClient; Error: Word);
var
Connection : TConnection;
begin
Connection := TConnection.Create;
Connection.Thread := Client;
end; 

但是客户端:TWSocketClient;有特定的课程吗?

1 个答案:

答案 0 :(得分:0)

您可以从TWSocketClient派生自定义类并在调用TWSocketServer.ClientClass之前将其分配给TWSocketServer.Listen()媒体资源,然后您可以向班级添加任何内容,并访问自定义字段/方法通过在需要时对TWSocketClient对象进行类型转换,例如在TWSocketServer.OnClientCreateTWSocketServer.OnClientConnect事件中。在以下EDN文章中有一个例子:

Writing Client/Server applications using ICS

在你的情况下,尝试这样的事情:

type
  TConnection = class
    Client: Pointer;
  end;

  TMyClient = class(TWSocketClient)
  public
    Connection: TConnection;
  end;

procedure Tmainserver.FormCreate(Sender: TObject);
begin
  server.ClientClass := TMyClient;
end;

procedure Tmainserver.serverClientConnect(Sender: TObject;
  Client: TWSocketClient; Error: Word);
var
  Connection: TConnection;
begin
  Connection := TConnection.Create;
  Connection.Client := Client;
  TMyClient(Client).Connection := Connection;
end;

procedure Tmainserver.serverClientDisconnect(Sender : TObject;
  Client : TWSocketClient; Error  : Word); 
begin
  FreeAndNil(TMyClient(Client).Connection);
end;

仅供参考,Indy也有类似的功能。在激活服务器之前,将自定义TIdServerContext派生类分配给TIdTCPServer.ContextClass属性,然后在需要时对TIdContext个对象进行类型转换,例如在TIdTCPServer.OnConnect和{{1事件:

TIdTCPServer.OnExecute

我更喜欢这种方法,而不是使用type TConnection = class Context: Pointer; end; TMyContext = class(TIdServerContext) public // TIdContext already has a property named 'Connection'... MyConnection: TConnection; end; procedure Tmainserver.FormCreate(Sender: TObject); begin server.ContextClass := TMyContext; end; procedure Tmainserver.serverConnect(AContext: TIdContext); var Connection: TConnection; begin Connection := TConnection.Create; Connection.Context := AContext; TMyContext(AContext).MyConnection := Connection; end; procedure Tmainserver.serverDisconnect(AContext: TIdContext); begin FreeAndNil(TMyContext(AContext).MyConnection); end; 属性。