我一直在使用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;有特定的课程吗?
答案 0 :(得分:0)
您可以从TWSocketClient
派生自定义类并在调用TWSocketServer.ClientClass
之前将其分配给TWSocketServer.Listen()
媒体资源,然后您可以向班级添加任何内容,并访问自定义字段/方法通过在需要时对TWSocketClient
对象进行类型转换,例如在TWSocketServer.OnClientCreate
和TWSocketServer.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;
属性。