RO36 - RemObjects SDK 3
中的
Multicast
事件
作者
Derek Davidson (www.enterpriseblue.co.uk)
RemObjects
提示
:
我们相信本文是正确的
,
但是我们不做任何担保
.
感谢
Andrea
的大作
,
很高兴可以在这里发布
.
RemObjects SDK 3 (RO3)
包含
Multicast Events
新特性
.
本文通过
SDK3
自带的范例来介绍这个主题
.
Multicast Events
是可以是
RO3
服务端触发一个或多个客户端事件的简单方式
.
你可以像其它事件一样写这种事件处理函数
.
这里介绍的可能很笼统
,
一些隐含的信息可以在
RO3
中的
Chat
范例中查看
.
你可能认为设置这种事件处理程序可能比其他简单的应用程序中的事件处理复杂
.
毕竟
,
我们我们设计的服务端和客户端可能远离数千公里
!
然而不必退缩
.
一旦你通过了最初的学习曲线
,
强大优美的设计等着你去开发
.
因此不做其他累述
,
开始我们的应用吧
:
写一个
Multicast RO
服务
1.
启动
Delphi,
在主菜单中选择
File | New | Other
.
弹出
New Items
对话框
,
选择
RemObjects SDK
标签然后选择
VCL Standalone
.
如下填写
New RemObjects SDK Server Project
对话框
:
图
1.
新的
RemObjects SDK
服务项目对话框
2.
完成服务
.
然后要求选择设计类型
,
介绍默认设置
(RemObjects Remote Datamodule).
点击
[OK].
3.
在
Delphi
主菜单
,
选择
RemObjects | Edit Service | Library
.
打开
RO Service Builder.
点击
[Event Sink]
按钮并重命名新项为
'MulticastTestEvent'
.
4.
点击
[Add Event].
为事件命名为
'OnSum'
.
不设置参数
.
关闭
RO Service Builder
并重新编译
RO3
服务端应用程序
.
如果检查你的源代码
,
你可以在
MulticastLibrary_Intf
文件
(
如
EID_MulticastTestEvent, IMulticastTestEvent
等
)
中发现
RO
自动生成的事件代码
.
5.
在服务端主窗体添加
TROInMemoryEventRepository
和
TROEventSessionManager
控件
.
对这些控件的详细信息请参考
RO SDK3 V3.0.1.279
版本的帮助文件
.
分别设置
ROInMemoryEventRepository1
控件的
Message
和
SessionManager
属性为
ROMessage
和
ROEventSessionManager1.
图
2.
正确设置
TROInMemoryEventRepository
6.
选择
MulticastService
的
RemoteDatamodule
.
在
Delphi
主菜单中选择
File | Use Unit
选择
fServerForm.
现在分别设置
EventRepository
和
SessionManager
属性为
ServerForm.ROInMemoryEventRepository1
和
ServerForm.ROEventSessionManager1.
Fig 3.
正确设置
MulticastService RO Remote Datamodule
7.
如同每个标准的
RO SDK
服务范例一样
,
在
MulticastService_Impl
单元完成
Sum
和
GetServerTime
方法
.
8.
为了在用户调用
Sum
方法时触发事件
,
你需要在方法中填写一行代码
:
function
TMulticastService.Sum(
const A: Integer; const B: Integer): Integer;
begin
Result := A + B;
{ Generates the OnSum event }
(EventRepository as
IMulticastTesterEvent_Writer).OnSum(Session.SessionID);
end
;
写
Multicast RO
客户端
9.
在客户端窗体中加入
TROEventReceiver
组件命名为
EventReceiver
.
分别设置其
Channel
和
Message
属性为
ROChannel
和
ROMessage.
设置
interval
属性为
1000
,
设置
ServiceName
为
MulticastService.
本质上
,
这个组件将每秒中去服务端检查一次是否有属于它的消息
.
图
4.
正确设置
TROEventReceiver
10.
在客户端窗体中添加一个按钮并设置其事件处理过程
:
procedure
TClientForm.Button1Click(Sender: TObject);
var
myService: IMulticastService;
res: integer;
begin
myService := CoMulticastService.Create(ROMessage,ROChannel);
res := myService.Sum(
1
,
2
);
ShowMessage(
'The result was '
+ IntToStr(res));
end
;
11.
将
implementation uses
子句中的
MulticastLibrary_Intf
引用转移到
interface uses
子句中
.
这样我们就可以在窗体类中声明我们上面添加的接口了
.
12.
修改客户端窗体的定义
:
TClientForm = class(TForm, IMulticastTestEvent)
13.
在类定义中
,
将如下代码添加到
private
节
:
private
procedure
OnSum;
14.
实现
OnSum
过程
:
procedure
TClientForm.OnSum
begin
ShowMessage(
'Someone used the sum method'
);
end
;
15. FormCreate
事件中添加如下代码
:
procedure
TClientForm.FormCreate(Sender: TObject);
begin
EventReceiver.RegisterEventHandlers([EID_MulticastTestEvent],[Self]);
EventReceiver.Active := True;
end
;
16. FormClose
事件中填写如下代码
:
procedure
TClientForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
EventReceiver.Active := False;
EventReceiver.UnregisterEventHandlers([EID_MulticastTestEvent]);
end
;
17.
现在我们完成了服务端和客户端
.
现在准备测试
.
运行服务端
,
运行单独的客户端拷贝
.
点击按钮后将弹出一个显示
Sun
方法返回值的对话框
.
图
5.
调用
Sum
方法的返回值
但是请注意我们没有在调用
Sum
方法的用户中得到一个对话框通知
.
这是因为默认情况下
RO3
不会向生成事件的客户端发生事件
.
18.
为验证事件的执行
,
运行另外一个客户端程序并点击按钮
.
如果没有什么以外
,
你将收到一个对话框通知
:
图
6:
对话框展示了
OnSum
事件已经触发
19.
现在完成了
Multicast
事件的介绍
.
但是我们还要介绍一下如何简单的增加其他事件
,
这时我们只是垂直的扩展我们的知识面
.
使用更多的事件扩展
RO3
服务
20.
现在我们添加一个将在用户调用
OnServerTime
方法时触发的事件
.
步骤如下
:
服务端
:
a.
使用
RO Service Builder
增加一个新的事件并命名为
OnGetServerTime.
b.
在
GetServerTime
方法中增加如下代码
:
(EventRepository
as IMulticastTestEvent_Writer).OnGetServerTime(Session.SessionID);
客户端
:
a.
在
Private
小节中增加一个
OnGetServerTime
过程声明
b.
在这个方法中调用另外一个
ShowMessage.
c.
在客户端窗体中添加另外一个按钮调用
GetServerTime
方法
OK!
像第
18
步一样测试一下
.
结论
本文介绍了
RO SDK3
中的新概念
Multicast Events
.
本文可能还应该说明一下其他的问题
,
如
RO
服务广播是向所有的客户端发送吗
?
或我可以限制发送的客户端吗
?
像这些问题将在其他文章中讨论
,
如果你感兴趣请关注
.