因为我的中间层有多个rdm,每个rdm又有多个方法,客户端和中间层不长连接,也就是用完就断开。现在要在服务器端纪录客户端的操作日志,如果用客户端提交的话,岂不是每次客户端调用远程方法都要提交自己的ip?
to wangxian11:
如果你说的服务器端控制客户端程序是指服务器回调客户端的话,可以在客户端也创建com对象,将其接口传递到服务器端,就可以实现回调了,大概就是这样了,dfw上有这样的贴子,你找找吧
procedure TServerWinSocket.ClientEvent(Sender: TObject;
Socket: TCustomWinSocket;
SocketEvent: TSocketEvent);
begin
case SocketEvent of
seAccept,
seLookup,
seConnecting,
seListen:
begin
要不 就直接
procedure TSocketForm.AddClient(Thread: TServerClientThread);
var
Item: TListItem;
begin
Item := ConnectionList.Items.Add;
Item.Caption := IntToStr(Thread.ClientSocket.LocalPort);
Item.SubItems.Add(Thread.ClientSocket.RemoteAddress);
if ShowHostAction.Checked then
begin
Item.SubItems.Add(Thread.ClientSocket.RemoteHost);
if Item.SubItems[1] = '' then
Item.SubItems[1] := SHostUnknown;
end else
Item.SubItems.Add(SNotShown);
if Thread is TSocketDispatcherThread then
Item.SubItems.Add(DateTimeToStr(TSocketDispatcherThread(Thread).LastActivity));
Item.Data := Pointer(Thread);
UpdateStatus;
end;
或者 直接 改这里
procedure TSocketDispatcherThread.ClientExecute;
var
Data: IDataBlock;
msg: TMsg;
Obj: ISendDataBlock;
Event: THandle;
WaitTime: DWord;
begin
CoInitialize(nil);
try
Synchronize(AddClient);
to zgcdelphi:
谢谢你指出我在组织语句是的错误,对于无状态对象,我的理解是他在不用的时候是无状态的,而当他被激活使用的时候应该还是由状态的吧。
所以我刚才的问题“如何知道某个com对象是由哪个客户端创建的?”可能改为“如何知道某个com对象当前正在为哪个客户端服务?”更确切一点。
另外midas的控件我只用了socketconnection,所以类似BeforeApplyUpdates的时机可能不多