com的回调事件应用。(200分)

  • 主题发起人 主题发起人 biggo
  • 开始时间 开始时间
B

biggo

Unregistered / Unconfirmed
GUEST, unregistred user!
我利用Com的回调机制,制作类似聊天室软件,
我在客户端程序如果采用非远程连接Com的方式,那么Com的回调事件很好的在我同时运行在一台机的客户端运行,
但如果使用远程连接方式(及DCom方式)调用Com,那么我的Com回调事件就没有很好的执行。
只有在发出信息的那个客户端才能接受到回调事件。其它的客户端也是在同一台机运行的。
所有的运行条件,除了调用Com改为远程方式外,其他都一样。
请问有这方面经验的高手,如何解决这个问题?
或者发送Com回调机制聊天室软件的简单例程参考下?
不胜感激。
 
仅激发了一个实例的事件。
 
我已经修改了激发实例事件的代码,能在收到一个客户发送的聊天信息后,自动发送到其它登陆的客户端上。

我现在的问题是,在客户端上,如果设置ConnectKind=ckRunningOrNew的时候,我要做的事情能正常执行。
但这种方式下,客户端是使用的本机调用Com机制,及客户端和服务端都在同一台机上。
在同一台机上启动多个客户端,我的Com执行的很好。
但实际应用中,不能在同一台机上启动两个客户端,自己和自己聊天的。
所以ConnectKind属性必须改为:ConnectKind=ckRemote方式及远程调用方式(又叫Dcom方式)
但在这种方式下,我还是在同一台机做测试,启动多个客户端,发现只有我发出信息的哪个客户端,才能正常返回Com的回调事件。激活其他的客户端回调事件都失效了。
 
别费劲了兄弟.
我研究了一个多月,最后不得不放弃.改用Socket吧.
 
to:barton
是吗?
研究一个月有什么收获?
我现在缺少,Com保存客户连接信息的资料,不清楚Com怎么自动保存客户连接资料的。
如果把这个问题搞清楚,可能会把问题解决。
 
研究一个月的收获就是COM的事件和回调整个就是梦。
如果不需要事件和回调,DCOM还是好用的。
 
我已经发现问题所在了,确实是个梦。

问题关键在我们调用Dcom服务器的时候,在服务器端设置了Dcom配置属性。所以客户发出的信息,服务端能处理。
但回调和一般的返回数据不同,Dcom服务器处理回调事件,其实是把客户端作为另一个Dcom服务看待调用的。
在客户端没有Dcom配置,所以服务器接收到客户信息,但服务器的回调信息因客户没有Dcom配置,所以回调信息不能正确发到客户端。
其实和Socket做的原理一样,Socket做,其实在服务端和客户端,都要实现一个SocketServer。Dcom也是一样,所以,客户端也要进行Dcom配置。

我已经做了尝试,客户端也是win2000,我在服务器和客户端都做好了Dcom配置,结果一切运行正常。
但在98下遇到了麻烦,98默认没有Dcom配置程序。

to:barton你还有其他经验吗,能不能说一下。
 
记得李维的书中讲过,MIDAS的数据格式可是自已定义。我因为不喜欢用基于TDataset的
机制所以需要使用自己定义的数据格式,就开始研究MIDAS,特别是SConnect单元。为了
实现服务端向客户端主动推数据如果用DCOM连接当然必须使用DCOM的事件和回调。过程
中非常棘手。我也向本论坛求救,见
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1133502
其实我在Win2000-Win2000环境下也试过,情况稍好一些总会多少有些反应,但不理想。
特别是当同一台机器上运行两个实例的时候,情况更是一塌糊涂。
我现在已经完全放弃了DCOM,改用Socket。现在两个项目都使用这种结构,当客户端向
服务器提交数据更新请求而改动数据的时候,能够向其它的客户端推数据,从而引发客
户端事件。现在运行一切正常。
 
to:barton
你还没有明白我的研究结果吗?

Dcom的事件和回调之所以在两台机器间运行不能正常实现,关键在客户机的Dcom配置上。
其实Dcom回调原理和Socket回调一样。不管是服务端和客户端,实际上都要实现一个服务接口。
我们之所以把程序分成服务端和客户端两部分,只是狭义上的名称。从技术原理广义的角度来说:
客户端调用服务器的时候,客户端调用服务端那么客户端是客户,服务端是服务器,很容易理解。
但反过来,Dcom服务的回调机制,在Dcom上启动回调服务,事实上这个Dcom服务器就成了客户端的客户了,而客户端反而在这个时候成了服务器。
他们之间的协议是基于Dcom的,所以,在没有配置客户端Dcom的权限的时候,服务端发出的回调事件,客户端是无法响应的。
所以,要实现Dcom回调,不管在服务端还是在客户端,都要配置好Dcom的权限。
Delphi COM深入编程书中的回调例子在单机多用户下,是可行的。之所以在多机上无法通过。就是没有正确配置客户端机器的Dcom权限。
我开放客户端的Dcom访问权限,Dcom回调就能很好的工作了。这一点,我已经实验通过。

还有,Midas和Dcom是两个不同的技术概念,作用和使用范围都不同。只是在Delphi中有个远程数据模块的向导把这两个东西连接到了一起。
如果你不喜欢Midas的话,完全客户用Ole的variant数据结构传递你的数据,模拟数据级。不过这样工作量要大很多。

现在我已经渐悟Com/Dcom原理,不过还没有达到一窍通百窍的状态。
作为我的理解
事实上许多Com/Dcom的原理和技术,在我们编程的时候都使用到了,比如回调(你用Scoket也是使用回调方法)等,在其它地方也使用得很广泛。
Com/Dcom事实上,只是把现有的技术有机的结合在一起,提升到了一个标准的平台上,当然它结合的东西实际上分开来看都是些很普通的东西。但它的技术难点就在于结合的手段和方法上。
想出Com结构的人,确实是天才,只是这个结合点,很难用文字来描述,需要意会理解。所以很多人学习Com,只是停留在依葫芦画瓢的基础上,事实并没有明白什么是Com。

当然,也有很多人写了很多com的书,想说明Com是什么,但Com的核心确实很难用几行简单的字所能描叙的。所以很多作者在学习com的时候,都说到有一个顿悟的时刻,而这个顿悟是难以用语言来描叙的。

所以com对很多人来说,还是那么枯涩难明。我也是在实验这个回调程序的时候,特别是在两台机联通Dcom回调机制的时候才有渐悟的感觉,似乎明白了Com是什么东西。

当然Com中,还有很多技术我还没有掌握,但我已经渐渐明白了Com技术的结合点。相信其它的问题都能迎刃而解。

希望其它学习Com的朋友,能尽快的顿悟吧。
 
后退
顶部