RemObjects文档翻译2.doc_第1页
RemObjects文档翻译2.doc_第2页
RemObjects文档翻译2.doc_第3页
RemObjects文档翻译2.doc_第4页
RemObjects文档翻译2.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

R003-Remote InvocationRemote Invocation可以让客户端像调用本地方法一样调用远程服务器上的方法.这个过程叫做Remote Procedure Call (RPC). 为了实现这个功能,客户端首先就要和一个类似于远程服务器的代理对象接口通讯. 这个代理对象叫做代理(proxy). 代理可以将方法调用转换成流在网络中传递. 服务器端接收到这个数据包,欢迎他的信息,调用真正的方法. 最后将执行结合或错误信息打包发送到客户端的代理. 最后,代理发送执行结果给调用者.像调用本地方法一样.RemObjects SDK 3.0 简介中我们看到了他的新特性和工具,这些都可以给我们开发方式带来很大的改进. 这篇文档我们看看关于产品的概况和令人兴奋的新特性. Service Tester 用处分布式系统提供的灵活性和适用性是传统的CS结构无法比拟的. 但是开发和测试分布式系统通常复杂费时.在基于服务的客户端程序开发中我们只是调试本程序还是不够的,还有大量的交互式请求和特定的服务过程大量触发的效率等. 一般的测试方案产生出脚本并测试最终用户应用, 但不能做到真正的模拟大量用户来代理远程服务器或使用一些RemObjects 特性. 这样你可以自己写测试应用程序或使用像DUnit的测试工具,但是还要有很多工作要作. RemObjects服务测试(ROST) 可以解决这些问题. 为每个服务方法产生测试脚本并使用多线程并发调用这些方法.测试完成ROST提供测试图解,其他的事物,每秒钟请求数量,网络传输情况等信息. 测试脚本可以保存,你修改了远程服务方法后可以再次运行查看修改后对系统效率和功能改善. ROST支持所有数据类型: 简单数量类型,复杂的结构体,二进制流和数组. 通过直观的界面可以输入测试函数的参数并观测最终执行结果. 下面的截图可以看到如何启动ROST来执行MegaDemo 中的EchoPerson 方法: 下面的截图是测试正在进行时的情况:ROST经配置后使用RemObjects SDK提供的所有通道(channels)和消息(message). 下面的截图显示连接配置对话框:ROST是一个很有价值的好帮手,使用它可以在测试评估你的应用程序服务器时节省大量时间. 这完全是RAD操作! 客户端均衡负载和容错处理 RemObjects SDK的设计目标是成为一个可升级系统. 默认的,RemObjects不指定固定连接,我们不用写代码就可以实现连接单个服务器或多个服务器.在Cisco范例中, Windows 网路均衡负载, F5 Networks hardware,和其他硬件软件都与RO-based 系统无缝的集成在一起. RemObjects 3.0 的传输通道已经升级支持客户端的均衡负载和容错.本质上你可以为你的通道的TROServerLocator属性明确的提供一系列的服务器列表. 你可以控制通道的均衡负载请求,或在当前服务器故障时选择另外一个.通道可以寻找服务并自动发现在线的服务器,但如果要尝试搜寻所有可能的目的源时很能会报异常. 下面的截图是在TROWinINetHTTPChannel中设置属性: 下面的截图展示了独立的TROServerLocator列表:最后,这个截图显示测试应用程序的两个服务器通过连接和断开模拟断线条件输出的结果: COM 和Active 脚本支持 虽然RemObjects服务器可以连接任何操作系统和客户端(Windows, Linux, Pocket PCs, .Net, Mono, 和其他用ANSI-C 编译的程序), 但在Windows系统下,COM几乎成了标准的用法. 一些应用程序像 Excel, Word, Lotus Notes可以通过OLE操纵, 有的高级用户可以用VBScript脚本控制它们. 在Web开发中,ASP的Web页面经常使用相似及的技术操作COM对象(VBScript 或JavaScript). RemObjects 3.0使用COM DLL规则,这样可以使一种语言能使用不同的RemObjects服务器. RemObjects SDK 3.0生成的COM library发布的库如下:ROServer.CreateService方法用服务方法名作参数返回一个对象可以将COM方法调用转换为RemObjects调用(二进制流或Soap). 通过使用ChannelType 和MessageType属性 (都是字符串), 你可以确定组件的类型,像TROBINMessage 和TROWinINetHTTPChannel, 与服务器通信. 通过使用SetXXXProperty 和ReadXXXProperty方法你可以自定义属性,例如TargetURL 或自定义压缩. 下面的截图展示了Excel电子表格调用MegaDemo服务器的Sum方法:与按钮相关的代码如下: Private Sub CommandButton1_Click() Dim result Set ROServer = CreateObject(RemObjects.COMServer) ROServer.MessageType = TROBINMessage ROServer.ChannelType = TROWinInetHTTPChannel ROServer.SetChannelProperty TargetURL, http:/localhost:8099/BIN Set MegaDemoService = ROServer.CreateService(NewService) Dim A, B A = Sheets(Sheet1).Cells(9, 4).Value B = Sheets(Sheet1).Cells(10, 4).Value result = MegaDemoService.Sum(A, B) MsgBox Sum & A & + & B & = & result Set MegaDemoService = Nothing Set ROServer = NothingEnd Sub下面的截图展示了ASP页面向用户显示简单信息: 代码如下: %Dim resultSet ROServer = Server.CreateObject(RemObjects.COMServer)ROServer.MessageType = TROBINMessageROServer.ChannelType = TROWinInetHTTPChannelROServer.SetChannelProperty TargetURL, http:/localhost:8099/BINSet MegaDemoService = ROServer.CreateService(NewService)Response.Write This is an ASP page that invokes methods Response.Write of the RemObjects MegaDemoresult = MegaDemoService.Sum(100, 200)Response.Write The result of 100+200 is & result & result = MegaDemoService.GetServerTimeResponse.Write The time on the server is & resultSet MegaDemoService = nothingSet ROServer = nothing%广播服务事件 服务器端 广播服务事件是RemObjects3.0新特性,运行服务器异步执行客户端的回调函数. 回调函数是在客户端定义而由服务器相应一个事件时调用. 假设一个聊天程序,当一个用户类型信息被中心服务器接受后,再转发到其他所有的用户.为了发送消息,服务器端需要调用客户端事件句柄(如OnSendMessage 方法). 只有当服务器能通过客户端的IP与其交互,或客户端在服务器回调中是启动的,才能完整这个功能. RemObjects SDK 2.0中可以让应用程序的客户端和服务器端同时调用我们描述的回调函数,但是这只限于局域网(由于网路地址转换的问题); 下图是解释: 当客户端1发送一个消息,由于服务器知道客户端2的直接IP地址(01)可以将其发送到客户端2.而客户端3和4是不能到达的,因为使用了共享IP地址(6)与聊天程序服务器相连.事实上不同局域网要共享相同的IP地址增加了其他的复杂性. 网络中的设备像网关,防火墙给整个问题带来了更大的复杂性. 通常,写不可升级和多网络碎片的分布式系统回调可以避免. 要使你的系统支持升级并让客户端接受远程通知的唯一解决方法就是使用基于客户端轮询和服务器队列的通道.而这就是广播服务器事件提供的. RemObjects 3服务器可以将客户端定时发送的消息存储在队列中,如下图:当客户端接受一个消息,他们将调用特定的事件处理程序(于Delphi的事件规则相同). 这个基于RemObjects3.0的聊天程序展示了如何生成用户连接一个或多个服务器上的程序. 这个例子可以让系统管理员远程断开客户端或适时的向客户端发送系统消息. 下面的截图展示了两个客户聊天的Session,收到了一个服务器要重新启动的消息.在RemObjects 3.0中这种功能很好实现. 服务器端我们定义了一个ChatService服务: IChatService = interface 6893042C-3354-4AE6-B5FA-E7A637475C30 procedure Login(const UserID: String); procedure Logout; procedure SendMessage(const MessageText: String);end;下面截图展示Service Builder:这个例子的目标是当一个方法被调用将在每个客户端抛出特定的事件. 在RemObjects 3.0中等以事件使用新类型Callback Sink 这个名字将在发布版本中改变. 聊天服务程序包含2个callback sinks 例子: ChatEvents (OnLogin, OnLogout, OnSendMessage)(当其他客户端有操作时客户端接收)和ChatServerEvents (OnSystemShutdown, OnMandatoryClose)(系统管理员向客户端发送消息). 下图展示了如何在Service Builder定义ChatEvents:RemObjects 预处理程序可以自动生成代码和callback sinks必要的接口声明.这是Delphi声明的ChatEvents和ChatServerEvents: IChatEvents IChatEvents = interface 75F9A466-518A-4B09-9DC4-9272B1EEFD95 procedure OnLogin(const aUserID: String); procedure OnLogout(const aUserID: String); procedure OnSendMessage(const aUserID: String; const aMessage: String);end; IChatServerEvents IChatServerEvents = interface E80B0A2E-96ED-4F38-A6AC-E4E0B59F27F3 procedure OnSystemShutdown(const ShutdownDelay: Integer; const Reason: String); procedure OnMandatoryClose(const ClientID: String; const Reason: String);end;下面的代码是执行在CharService 中的Login方法,他触发了所有客户端OnLogin事件: procedure TChatService.Login(const UserID: String);begin Checks if the user is already logged in if fUsers.IndexOf(UserID)=0 then raise Exception.CreateFmt(User %s is already logged in, UserID); Adds the user to the list of logged users fUsers.Add(UserID); Session.ValuesUserID := UserID; Generates the OnLogin event (EventRepository as IChatEvents_Writer).OnLogin(Session.SessionID, UserID);end;最后一行代码(EventRepository asIChatEvents_Writer).OnLogin(Session.SessionID, UserID); 在所有的客户端触发OnLogin事件. 虽然开起来有些零乱,但是这样很简单而且与标准控件事件同样工作.这段代码与TButton.Click方法等效: procedure TButton.Click;begin /. if Assigned(OnClick) then OnClick(Self);end;主要的不同是事件1在服务器端触发并有多个接收者(广播),而事件2不是立即执行的,因为实际上OnLogin调用存储后有其它用户触发. EventRepository属性指向一个拖放到主窗体的存储对象,其中存储了OnLogin,OnSendMessage等序列化方法和其参数. IChatEvent_Writer是在声明ChatEvents时生成的特殊接口,并可以在存储器中初始化IChatEvent消息.代理依赖事件存储器就像标准的RemObjects代理依赖传输端口一样. TChatEvents_Writer.OnLogin被包含在ChatLibrary_Intf.pas文件: procedure TChatEvents_Writer.OnLogin(const Sender : TGUID; const aUserID: String);var _eventdata : Binary;begin _eventdata := Binary.Create; try _Message.Initialize(NIL, ChatLibrary, EID_ChatEvents, OnLogin); _Message.Write(aUserID, TypeInfo(String), aUserID, ); _Message.Finalize; _Message.WriteToStream(_eventdata); Repository.StoreEventData(Sender, _eventdata); except _eventdata.Free; end;end;就像我们期待的一样,这也是自动生成的. 在服务器方法中,下面的是在客户端向其他客户端发送信息时由此客户端触发的代码: procedure TChatService.SendMessage(const MessageText: String);var thisuserid : string;begin Extract the name of the user invoking this method by reading session information thisuserid := VarToStr(Session.ValuesUserID); Generates the OnSendMessage event (EventRepository as IChatEvents_Writer).OnSendMessage( Session.SessionID, thisuserid, MessageText);end;又一次使用了一行代码触发远程事件. 广播服务事件 客户端 写客户端相应服务器事件也很简单. 基本上只要实现事件接口(IChatEvents和IChatServerEvents)及通知RemObjects框架对象已经实现了这些接口. 一个新的控件TROEventReceiver 在轮询远程事件存储器,周期性的查看服务器是否有未处理的消息并在需要的时候调用对象方法. 客户端包含一个叫做EventReceiver 的TROEventReceiver 控件. 在客户端例程中,主窗体实现了IChatEvents 和IChatServerEvents 接口,声明如下: TClientForm = class(TForm, IChatEvents, IChatServerEvents)/.protected IChatEvents procedure OnSendMessage(const aSender, aMessage : string); procedure OnLogin(const aUserID : string); procedure OnLogout(const aUserID : string); IChatServerEvents procedure OnSystemShutdown(const ShutdownDelay: Integer; const Reason: String); procedure OnMandatoryClose(const ClientID: String; const Reason: String);/.end;当用户点击Login按钮,下面的代码将执行: procedure TClientForm.bbLoginClick(Sender: TObject);begin try ROChannel.TargetURL := cbServer.Text; Calls the remote login method fChatService.Login(UserID); Register the event handlers using the TROEventReceiver called EventReceiver EventReceiver.RegisterEventHandlers( EID_ChatEvents, EID_ChatServerEvents, Self, Self); Starts polling EventReceiver.Active := TRUE; fLoggedIn := TRUE; finally ToggleControls; end;end;方法TROEventReceiver.RegisterEventHandlers获取一系列的回调接口ID (parameters EID_ChatEvents, EID_ChatServerEvents)及实现他的对象 (这个例子都是self,因为这里都是用MainForm实现这两种事件处理接口的). EID_xxx是与回调接口同名的字符串常量,声明如下: unit ChatLibrary_Intf;/.const/. Event IDs EID_ChatEvents = ChatEvents; EID_ChatServerEvents = ChatServerEvents;当IChatEvents 或IChatServerEvents事件到达,MainForm中相关的方法将自动执行,这就像OnClick事件一样,这些都是对开发者透明的. 下面的一小段程序展示了OnLog,OnSendMessage,OnSystemShutdown的实现,这些方法觉定了在运行期如何输出信息: procedure TClientForm.OnLogin(const aUserID: string);begin WriteMessage(mtSystem, , User +aUserID + just logged in);end;procedure TClientForm.OnSendMessage(const aSender, aMessage: string);begin WriteMessage(mtMessage, aSender, aMessage);end;procedure TClientForm.OnSystemShutdown(const ShutdownDelay: Integer; const Reason: String);begin Beep; MessageDlg(Format(The server will be shut down in %d minutes. +#13Reason: %s, ShutdownDelay, Reason), mtWarning, mbOK, 0);end;WriteMessage是一个向MainForm窗体的Memo控件显示文本信息的简单函数.紧记,除了调用EventReceiver.RegisterEventHandlers 和用户注销时的EventReceiver.UnregisterEventHandlers,实现消息处理接口外,不再需要其他的处理事件了. Master Server The RemObjects SDK允许我们将Session信息存储在内存中或数据库中, 如果你想要你的系统均衡负载和容错,需要将Session保存到每个服务器都可以存取的数据库中,这样客户端无论连接到哪台服务器都可以取出一致的Session信息.这个功能就是RemObjects SDK 2.0的 TRODBSessionManager提供的. 但是,数据库Session管理折中了速度和需求. 存取远程数据库比使用内存数据要慢,并且要设置存储Session信息必需的表结构. RemObjects Master Server (ROMS)按RemObjects SDK 3.0标准提供,可集中高效的处理我们的Session和服务器事件数据.安装Snap后可以高效简单的对数据库表操作. ROMS以NT服务或独立可执行程序的方式发布API,使用这些API我们就可以存取Session信息和服务器事件. 这些API使用RemObjects二进制流消息通过HTTP,TCP,UDP或Win消息通道传递.由新的控件TROMasterServerSessionManager 和TROMasterServerEventRepository封装. 记住,你可以使用这些API,并且有完整的ROMS源码,但是RO3.0提供的新控件使我们不需要直接去调用ROMS方法,事实上我们只需用TROMasterServerSessionManager替换TROInMemorySessionManager 并设置一组属性就可以了. ROMS使用嵌入的 NexusDB服务器保存数据, 可以使数据吞吐率更好于重量级的数据库. 使用RemObjects消息读取ROMS可以在不同的局域网中共享Session. 下面的截图展示了高版本的聊天范例: 这个高版本的聊天程序展示了两个客户端连接到分离的两个服务器上,可以像连接到一个服务器一样交换信息. 这两个服务器可能是一个服务器丛的一部分,或在远程存放并连接到同一个ROMS. ROMS联合客户端特性可以支持均衡负载和容错处理,这样我们的系统可以24X7不间断运行,并可以跨多局域网段,提供Session数据共享功能. ROMS源码包含于RemObjects SDK 3.0,需要非附加许可证文件. ServiceBuilder 3 RemObjects SDK 3.0的一个新特性就是提供了一个新的ServiceBuilder 3,它完全从写,提供了更多用户接口和自定义插件.事实上SB3中所有的功能都是插件式的,以后会增加新的功能. 这里是SB3的插件基础,这些可以用附加的插件修改和扩充: Libr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论