远程调用技术代码追踪之(RemObjects)
如何进行代码的版本追踪和历史记录管理

如何进行代码的版本追踪和历史记录管理代码的版本追踪和历史记录管理是软件开发过程中非常重要的一部分。
它们帮助开发人员跟踪和管理代码的变化,使得团队成员能够协同工作,并在需要时快速恢复或回溯到之前的版本。
本文将介绍代码版本追踪和历史记录管理的概念、工具和最佳实践。
代码版本追踪和历史记录管理是软件开发中的一项重要工作,它为团队提供了一种有效的方式来管理代码的变化。
它们可以帮助开发人员更好地协同工作,保持代码库的整洁和可维护性,并在出现问题时快速回退到之前的版本。
代码版本追踪和历史记录管理有助于团队在开发过程中更好地跟踪代码的变化,并确保所有成员都能理解代码的演变过程。
为了实现代码的版本追踪和历史记录管理,我们需要使用一些专门的工具和技术。
下面将介绍一些常用的代码版本控制工具和最佳实践,帮助团队更好地管理代码的变化和历史记录。
一、代码版本控制工具1. GitGit是一款非常流行的分布式版本控制工具,它可以帮助开发人员快速、高效地管理代码的变化。
Git具有很多功能强大的特性,比如分支管理、合并、提交、回滚等,使得团队成员能够更好地协同工作并保持代码库的整洁。
2. SVNSVN是另一款常用的版本控制工具,它是集中式的版本控制系统,相比Git而言,SVN在一些特定的场景下可能更加适用。
SVN也具有很多功能强大的特性,比如分支管理、合并、提交、回滚等,同样能够帮助团队更好地管理代码的变化和历史记录。
3. MercurialMercurial是一款类似于Git的分布式版本控制工具,它同样具有很多强大的功能,适用于各种规模的团队和项目。
Mercurial也可以帮助团队更好地管理代码的变化和历史记录。
以上介绍的三款版本控制工具都是非常流行和常用的,团队可以根据自身的需求和偏好来选择适合的工具。
无论选择哪种版本控制工具,团队都需要遵循一些最佳实践来更好地管理代码的变化和历史记录。
二、代码历史记录管理的最佳实践1.提交频率团队成员应该将代码提交到版本控制系统中,而不是保留大量的本地修改。
RMI远程方法调用讲解教程

RMI是远程方法调用的简称,象其名称暗示的那样,它能够帮助我们查找并执行远程对象的方法。
通俗地说,远程调用就象将一个class放在A机器上,然后在B机器中调用这个class的方法。
我个人认为,尽管RMI不是唯一的企业级远程对象访问方案,但它却是最容易实现的。
与能够使不同编程语言开发的CORBA不同的是,RMI是一种纯Java 解决方案。
在RMI中,程序的所有部分都由Java编写。
在看本篇文章时,我假定读者都已经具备了较扎实的Java基础知识,在这方面有欠缺的读者请自行阅读有关资料。
概念我在前面已经提到,RMI是一种远程方法调用机制,其过程对于最终用户是透明的:在进行现场演示时,如果我不说它使用了RNI,其他人不可能知道调用的方法存储在其他机器上。
当然了,二台机器上必须都安装有Java虚拟机(JVM)。
其他机器需要调用的对象必须被导出到远程注册服务器,这样才能被其他机器调用。
因此,如果机器A要调用机器B上的方法,则机器B必须将该对象导出到其远程注册服务器。
注册服务器是服务器上运行的一种服务,它帮助客户端远程地查找和访问服务器上的对象。
一个对象只有导出来后,然后才能实现RMI 包中的远程接口。
例如,如果想使机器A中的Xyz对象能够被远程调用,它就必须实现远程接口。
RMI需要使用占位程序和框架,占位程序在客户端,框架在服务器端。
在调用远程方法时,我们无需直接面对存储有该方法的机器。
在进行数据通讯前,还必须做一些准备工作。
占位程序就象客户端机器上的一个本机对象,它就象服务器上的对象的代理,向客户端提供能够被服务器调用的方法。
然后,Stub就会向服务器端的Skeleton发送方法调用,Skeleton就会在服务器端执行接收到的方法。
Stub和Skeleton之间通过远程调用层进行相互通讯,远程调用层遵循TCP/IP协议收发数据。
下面我们来大致了解一种称为为“绑定”的技术。
客户端无论何时要调用服务器端的对象,你可曾想过他是如何告诉服务器他想创建什么样的对象吗?这正是“绑定”的的用武之地。
如何进行代码错误追踪和修复

如何进行代码错误追踪和修复代码错误是每个程序员在开发过程中都会遇到的常见问题。
及时而准确地追踪和修复代码错误,不仅有助于提高代码质量,还能提升开发效率。
本文将介绍如何进行代码错误追踪和修复,以帮助程序员更好地应对这个挑战。
1. 日志记录与分析代码错误追踪的第一步是通过日志记录与分析,确定错误发生的位置和原因。
在代码中适时地插入日志语句,记录关键变量的取值以及代码执行路径。
当错误发生时,通过查看日志可以快速定位错误的代码行,并获取相关调试信息。
2. 调试器的使用调试器是程序员的得力工具,能够帮助快速定位和修复代码错误。
通过设置断点和单步执行功能,程序员可以逐行查看代码的执行过程,查看变量的实际取值,从而找出错误所在。
调试器提供了一系列功能,如监视变量、查看函数调用栈等,都对于错误追踪和修复有很大帮助。
3. 单元测试的重要性单元测试是代码质量保证的重要环节,也是尽早发现和修复错误的有效手段。
通过编写各种测试用例,覆盖代码的不同执行路径和边界情况,可以发现隐藏的错误,并提供验证修复效果的方式。
持续进行单元测试,将有助于代码错误的追踪和修复,以及提高代码的鲁棒性和可维护性。
4. 版本控制与代码回溯版本控制系统是团队协作和代码错误修复的重要工具。
通过版本控制系统,可以管理和追踪代码的不同版本,并在出现问题时进行代码回溯。
通过根据错误发生时的版本,对比修改前后的代码差异,可以更精确地定位问题所在,并进行修复。
5. 代码审查与知识共享代码审查是一种非常有效的错误追踪和修复手段。
团队成员对彼此的代码进行审查,可以发现潜在的错误和改进的空间。
通过分享错误的发现和修复过程,可以帮助团队成员更好地理解和解决类似问题。
代码审查和知识共享将为错误追踪和修复提供更广泛的视角和解决方案。
6. 错误报告和反馈机制及时收集和反馈用户报告的错误情况,对于代码错误的修复至关重要。
通过建立明确的错误报告机制,及时响应用户的报告,并进行问题分析和修复。
远程调用技术代码追踪RO(底层分析与多线程技术)

最近阅读了SocketConn的源码和WebService 的源码,把追踪的过程写了下来,方便大家学习。
毕竟这需要精力,时间和毅力。
感谢煮茶待英雄博志区和三层数据库讨论区兄弟们的支持,特别是julian兄弟,不是他,我可能没耐心继续下去。
如果有时间,大家可以继续完善。
从socket和Websevice的底层实现细节,我们发现BORLAND的工程师们的构思和实现的过程。
我觉得这对我们的学习应该是非常重要的。
学会思考。
学会读源码,学会分析。
希望和我交往的朋友可通过QQ或Email联系我。
Wu_yanan2003@另见:《远程调用技术代码追踪(webservice) 》关注我的:《远程调用技术代码追踪(第三方控件) 》RO网络控件分析:在上一篇中已经分析了代码,但觉得网络这一块分析的不够。
特写出来做为补充。
最近听说DXSOCKET不错。
偶今天专门下了下来,而且分析了一下它的线程池。
TDXServerCore.Create(Self); 从创建开始。
constructor TDXServerCore.Create(AOwner: TComponent);begininherited create(aowner);fbActive:=False;fiMaxConn:=200; //最大连接数fbBufferCreates:=True; //使用线程池。
fWhichProtocol:=wpTCPOnly;fBlockSizeFlags:=bsfHuge;fServerType:=stThreadBlocking;end;接着,SetActive -> IntSetActive –>.Startprocedure TDXServerCore.SetActive(value: boolean);begin………ListenerThread := TDXServerCoreThread.Create(True); 创建线程。
代码监控:实时追踪程序运行状态

代码监控:实时追踪程序运行状态代码监控(Code Monitoring)是指对程序运行的实时追踪和监控。
通过代码监控,开发人员可以及时发现程序中的异常情况,及时做出调整和处理。
随着软件开发与运维的不断发展,代码监控在当今的软件开发和运维中扮演着越来越重要的角色。
一、代码监控的意义代码监控是软件开发与运维中的一个关键环节,其意义主要体现在以下几个方面:1.及时发现和解决问题。
通过代码监控,开发人员能够实时追踪程序的运行状态,及时发现运行过程中的异常情况,快速定位问题所在,并进行相应的处理和调整,保障系统运行的稳定性和可靠性。
2.提高开发效率。
通过代码监控,开发人员可以清晰地了解程序的运行情况,快速定位问题,并提出解决方案,从而提高开发效率,缩短故障处理时间,提升开发人员的工作效率。
3.改善用户体验。
通过代码监控,可以及时发现并解决程序中的性能瓶颈和bug,提高系统的稳定性和性能表现,从而改善用户的使用体验,增强用户对产品的信任和满意度。
4.保障系统安全。
通过代码监控,可以发现系统中的安全漏洞和风险,及时进行修复,提升系统的安全性,保障系统数据和用户信息的安全。
二、代码监控的实施方式1.日志监控。
日志是程序运行过程中生成的重要信息记录,通过监控日志,可以了解程序的运行状态、异常情况等,是代码监控的重要手段之一。
2.性能监控。
通过监控系统的性能指标,如CPU利用率、内存占用、网络流量等,可以及时发现系统中的性能瓶颈,保障系统的稳定性和性能表现。
3.异常监控。
通过监控程序的异常情况,如报错信息、堆栈跟踪等,可以及时发现程序中的bug和问题,及时进行修复。
4.安全监控。
通过监控系统的安全指标,如登录异常、恶意攻击等,可以及时发现系统中的安全威胁,保障系统的安全性。
5.监控报警。
通过设置监控报警规则,当程序出现异常情况时,及时向相关人员发出告警通知,以便及时进行处理。
三、代码监控的工具与技术1.日志管理工具。
如何进行代码追踪和日志记录

如何进行代码追踪和日志记录代码追踪和日志记录是软件开发过程中非常重要的环节。
通过追踪代码执行过程和记录日志,可以帮助我们分析和解决问题,改善软件性能,并增强对系统的监控和调试能力。
本文将介绍如何进行代码追踪和日志记录,以及其在软件开发中的应用。
一、代码追踪代码追踪是指通过记录代码的执行路径和调用关系,以便分析代码的执行过程。
下面是一些常用的代码追踪方法:1. 方法注入(Method Injection):通过在关键方法中插入代码,记录方法的调用顺序和参数,以及返回结果。
这种方法可以手动实现,也可以使用一些开源工具,如AspectJ。
2. 调试器(Debugger):调试器是软件开发中常用的工具,可以在开发过程中对代码进行单步调试,并观察代码的执行过程。
通过设置断点和查看变量的值,我们可以准确地追踪代码的执行。
3. 日志框架(Logging Framework):许多编程语言都提供了日志框架,如Java的Log4j和Python的logging模块。
通过在代码中插入日志语句,我们可以记录代码的执行过程、关键变量的值、异常信息等。
二、日志记录日志记录是指将系统运行时的信息记录下来,以便进行监控、故障排查和性能优化。
下面是一些常用的日志记录方法:1. 标准输出(Standard Output):将日志信息输出到控制台,可以通过调试器或命令行查看。
这种方法简单直接,适合开发和调试阶段。
但是,在生产环境中使用标准输出会影响性能,因此通常不建议在正式发布版本中使用。
2. 文件日志(File Logging):将日志信息输出到文件中,可以通过文本编辑器或专门的日志查看工具进行查看。
文件日志可以配置日志的级别(如DEBUG、INFO、WARN、ERROR等),以便在不同场景下控制日志输出的详细程度。
3. 数据库日志(Database Logging):将日志信息保存到数据库中,可以结合数据库查询语言进行高级查询和分析。
如何进行编程技术的远程调用
如何进行编程技术的远程调用远程调用是现代编程中常用的一种技术,它允许程序在不同的计算机或服务器之间进行通信和交互。
通过远程调用,我们可以实现分布式系统、微服务架构以及跨平台的数据共享等功能。
本文将探讨如何进行编程技术的远程调用,以及一些常见的远程调用协议和框架。
一、什么是远程调用远程调用(Remote Procedure Call,简称RPC)是一种编程技术,它允许程序在不同的计算机或服务器之间进行函数调用。
换句话说,我们可以在一台计算机上调用另一台计算机上的函数,就像调用本地函数一样。
远程调用可以隐藏底层的网络通信细节,使得分布式系统的开发更加简单和高效。
二、远程调用的原理远程调用的原理可以简单概括为以下几个步骤:1. 客户端调用:客户端程序发起远程调用请求,指定要调用的函数和参数。
2. 参数封装:客户端将调用的函数和参数封装成一个消息,发送给服务器。
3. 网络传输:客户端通过网络将封装好的消息发送给服务器。
4. 服务器接收:服务器接收到消息后,解析出调用的函数和参数。
5. 服务器执行:服务器执行调用的函数,并将结果返回给客户端。
6. 结果返回:服务器将执行结果封装成一个消息,通过网络返回给客户端。
7. 结果解析:客户端接收到结果后,解析出返回值,并继续执行后续的逻辑。
三、远程调用协议远程调用协议是远程调用过程中的通信规范,常见的远程调用协议有以下几种:1. HTTP:基于传输层协议的远程调用协议,使用标准的HTTP请求和响应进行通信。
它广泛应用于Web服务和RESTful接口。
2. XML-RPC:使用XML作为数据交换格式的远程调用协议,支持多种编程语言和平台。
3. JSON-RPC:使用JSON作为数据交换格式的远程调用协议,与XML-RPC类似,但更加轻量级和易于解析。
4. gRPC:由Google开发的高性能远程调用框架,使用Protocol Buffers作为数据交换格式,支持多种编程语言和平台。
java远程调用方法
java远程调用方法Java远程调用方法是指在不同的Java虚拟机之间调用方法。
通过Java远程调用技术,可以在不同的计算机、不同的网络环境下实现Java程序之间的方法调用。
Java远程调用技术可以让分布式系统的不同模块之间实现通信和数据交换,从而构建出大型的分布式应用系统。
Java远程调用技术主要包括Java RMI、Java Web Services、Java CORBA等。
其中,Java RMI是最常用的一种Java远程调用技术。
Java RMI是Java Remote Method Invocation的缩写,它是Java语言提供的一种基于对象的远程调用机制。
Java RMI可以让Java程序在远程机器上执行方法,并返回结果。
Java RMI底层使用了Java序列化技术,通过序列化和反序列化来传递对象和数据。
Java Web Services是另一种常用的Java远程调用技术。
Java Web Services是一组基于XML的开放标准,用于实现分布式系统之间的通信。
Java Web Services主要包括SOAP、WSDL和UDDI等技术。
通过Java Web Services,可以实现跨平台、跨语言的通信,并且可以通过Internet进行数据交换。
Java CORBA是另一种常用的Java远程调用技术。
CORBA是Common Object Request Broker Architecture的缩写,它是一种面向对象的远程调用技术。
Java CORBA可以让Java程序通过ORB(Object Request Broker)与其他语言的程序通信,并且可以实现跨平台、跨语言的通信。
总之,Java远程调用技术为分布式系统之间的通信提供了强大的支持。
通过Java远程调用技术,可以实现高效的方法调用和数据交换,从而构建出强大的分布式应用系统。
远程调用实验报告
一、实验目的1. 了解远程调用的基本原理和方法。
2. 掌握使用Java RMI实现远程调用。
3. 熟悉网络编程中的通信协议和编程技巧。
二、实验环境1. 操作系统:Windows 102. 开发工具:Eclipse3. 编程语言:Java4. 网络环境:有线或无线局域网三、实验内容1. 远程调用原理2. Java RMI编程3. 实现远程计算器四、实验步骤1. 远程调用原理远程调用(Remote Procedure Call,RPC)是一种通过网络实现不同主机上的程序之间通信的技术。
它允许一个程序调用另一个程序,就像调用本地函数一样,而无需关心该程序运行在哪个主机上。
远程调用涉及以下步骤:(1)客户端发送调用请求;(2)服务器端接收调用请求,执行操作;(3)服务器端将结果返回给客户端。
2. Java RMI编程Java RMI(Remote Method Invocation)是一种Java语言提供的远程调用机制。
它允许Java程序在不同的主机上运行,并实现远程方法调用。
Java RMI编程步骤如下:(1)定义远程接口:继承java.rmi.Remote接口;(2)实现远程接口:实现远程接口的方法;(3)导出远程对象:使用java.rmi.exportObject()方法导出远程对象;(4)注册远程对象:使用java.rmi.Naming.rebind()方法注册远程对象;(5)客户端调用远程方法:使用java.rmi.Naming.lookup()方法查找远程对象,然后调用其方法。
3. 实现远程计算器本实验实现一个简单的远程计算器,包括加、减、乘、除四种运算。
(1)定义远程接口```javaimport java.rmi.Remote;import java.rmi.RemoteException;public interface Calculator extends Remote {double add(double a, double b) throws RemoteException;double subtract(double a, double b) throws RemoteException;double multiply(double a, double b) throws RemoteException;double divide(double a, double b) throws RemoteException;}```(2)实现远程接口```javaimport java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class CalculatorImpl extends UnicastRemoteObject implements Calculator {public CalculatorImpl() throws RemoteException {super();}@Overridepublic double add(double a, double b) throws RemoteException {return a + b;}@Overridepublic double subtract(double a, double b) throws RemoteException {return a - b;}@Overridepublic double multiply(double a, double b) throws RemoteException {return a b;}@Overridepublic double divide(double a, double b) throws RemoteException {if (b == 0) {throw new RemoteException("除数不能为0");}return a / b;}}```(3)导出远程对象```javaimport java.rmi.Naming;public class CalculatorServer {public static void main(String[] args) {try {Calculator calculator = new CalculatorImpl();Naming.rebind("rmi://localhost:1099/Calculator", calculator); System.out.println("Calculator服务启动成功!");} catch (Exception e) {e.printStackTrace();}}}```(4)客户端调用远程方法```javaimport java.rmi.Naming;public class CalculatorClient {public static void main(String[] args) {try {Calculator calculator = (Calculator)Naming.lookup("rmi://localhost:1099/Calculator");double result = calculator.add(10, 5);System.out.println("加法结果:" + result);result = calculator.subtract(10, 5);System.out.println("减法结果:" + result);result = calculator.multiply(10, 5);System.out.println("乘法结果:" + result);result = calculator.divide(10, 5);System.out.println("除法结果:" + result);} catch (Exception e) {e.printStackTrace();}}}```五、实验结果与分析通过实验,成功实现了远程计算器,实现了加、减、乘、除四种运算。
如何使用代码追踪工具进行Bug定位(二)
代码追踪工具是软件开发过程中常用的一种工具,它能够帮助开发者快速定位和修复Bug。
本文将以1200字左右的篇幅,介绍如何使用代码追踪工具进行Bug定位。
一、什么是代码追踪工具代码追踪工具是一种软件开发辅助工具,它能够记录程序运行过程中的细节,包括函数的调用路径、变量的赋值和引用等。
代码追踪工具可以帮助开发人员分析程序的执行流程,快速定位并修复Bug。
二、使用代码追踪工具进行Bug定位的流程1. 线上Bug的复现在开始Bug定位之前,首先需要能够复现该Bug。
可以通过复现用户提交的Bug报告,或者通过模拟用户场景来复现Bug。
建议在开发环境中尽量还原线上环境,以确保复现Bug的准确性。
2. 添加代码追踪工具在复现Bug的环境中,可以通过添加代码追踪工具来收集程序运行过程中的详细信息。
代码追踪工具通常提供API或者插件,可以方便地嵌入到代码中。
添加代码追踪工具后,可以通过设置断点或者日志输出来收集相关信息。
3. 运行程序并收集信息运行程序,并尽可能多地触发Bug。
当程序运行到断点处或者输出日志时,代码追踪工具将记录下程序的执行流程、变量的赋值和引用等细节。
这些信息将为Bug定位提供重要参考。
4. 分析收集的信息收集到足够信息后,可以开始分析这些信息。
可以使用代码追踪工具提供的调试工具或者分析工具,对收集到的信息进行可视化展示或者深入分析。
通过观察程序的执行流程和变量的变化,可以找到Bug 出现的原因。
5. 定位Bug并修复根据分析结果,可以确定Bug出现的具体位置。
可以使用代码追踪工具提供的定位功能,快速跳转到对应的代码位置。
在定位到Bug 后,可以进行修复,并验证修复后的代码是否解决了Bug。
三、常用的代码追踪工具1. XdebugXdebug是一款功能强大的代码追踪工具,支持PHP语言。
它可以帮助开发者跟踪程序运行过程中的函数调用和变量变化,提供了调试器和分析器等功能,非常适合PHP程序的Bug定位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
远程调用技术代码追踪之(RemObjects)最近阅读了SocketConn的源码和WebService 的源码,把追踪的过程写了下来,方便大家学习。
毕竟这需要精力,时间和毅力。
感谢煮茶待英雄博志区和三层数据库讨论区兄弟们的支持,特别是julian兄弟,不是他,我可能没耐心继续下去。
如果有时间,大家可以继续完善。
从socket和Websevice的底层实现细节,我们发现BORLAND的工程师们的构思和实现的过程。
我觉得这对我们的学习应该是非常重要的。
学会思考。
学会读源码,学会分析。
希望和我交往的朋友可通过QQ或Email联系我。
Wu_yanan2003@另见:《远程调用技术代码追踪(webservice) 》《远程调用技术代码追踪(Socket) 》《远程调用技术代码追踪(ASTA) 》《远程调用技术代码追踪(RemObjects) 》远程调用技术内幕在前面我已经分析了socket和webservice的代码追踪。
现在总结一下:三层架构的运作模型:1. BizSnap与.NET Remoting 的Server端运作模式当Client 将Request 送达Server端后,会经过一个Message Dispatcher机制,这个机制大多是几个重要的组件合作完成,主要在于解出Request中对于所要求对象的描述,以及欲呼叫的方法等信息,有了这些信息后Dispatcher就可以找到对应的对象与方法,接着就开始了呼叫动作,由于Request 是SOAP讯息格式,并不能直接用来呼叫对象的方法,因此得先将SOAP讯息转化为Stack(堆栈),完成这个转换动作后就到了这种处理模式中的核心概念了,也就是建立起目的对象并呼叫对应的方法,这个动作非常依赖前面的Message To Stack程序,因为这个程序会将SOAP讯息转化为Stack,有了Stack之后Push Stack and Call Method 动作才能正确的执行,那么如何呼叫目的方法呢?很简单,只要利用该语言所提供的RTTI信息(.NET 中则是MetaData),就可取得该方法的内存地址,接着只须以低阶的ASM 或IL 所提供的CALL 指令即可呼叫该方法,由于已将SOAP讯息转为Stack,因此传入参数就不是问题了。
在呼叫结束后,Stack 中已经有了传回的参数,接着只须将Stack转回SOAP 讯息传回给Client端就可以了。
BizSnap、.NET Remoting 的Client端运作模式不管是BizSnap或是.NET Remoting,当Client端欲呼叫Web Services时都会经过一个Proxy Object,于BizSnap中这个对象就是THTTPRIO,.NET Remoting中这个对象就是RealProxy,由于这个对象属于静态的,因此在使用之前必需将其转型回目的对象的型别,当Client端下达转型动作后整个魔法就开始运行了,首先Proxy Object会利用RTTI或是MetaData信息取得欲转型的类别信息,并依照这些信息建立起一个兼容于该类别的对象(Transparent Proxy Object),接着将这个对象中的所有方法地址替换为Stub Method,Stub Method 做的事情很单纯,只是将Stack转为SOAP Message后送出,当Server端响应后再将SOAP Message转换为Stack 后返回,这样整个Client端呼叫动作就完成了,下次再呼叫时只需由Cache中取出这个已建立好的Transparent Proxy Object,就可以直接进行呼叫,这可以避免因反复以RTTI或是MetaData建立Transparent Proxy Object而失去效率。
BizSnap、.NET Remoting 的处理模式属于较低阶的方法,这种方法的坏处大于好处,好处是设计者可以完全不了解其内部运作,以传统方式来撰写程序,坏处是过度依赖编译器及平台,增加日后移植到其它语言或平台上的难度,另外使用动态产生对象类别的低阶技术很容易引发效率及内存管理的问题。
2. NET Web Services 与JavaNET Web Services 与Java 的处理模式与.NET Remoting、BizSnap大同小异,其间最大的不同之处在于这种模式利用了其语言的特性,采动态呼叫的方式来执行呼叫的动作,而非如先前所提的模式在Stack与Message之间进行转换,这种模式简单的在Client端与Server端之间插入一个预先编译好的Proxy Object,这个Object是由WSDL所产生的,其中定义了所有目标对象的方法,在这些方法中简单的将传入的参数转换为SOAP Message,将传回的讯息转回参数,其间的运作完全属于高阶型态:Client 端的呼叫服务器端:由上面两个图上可看出,这种模式讲求简单,Client端的Stub Method 由原本的一个变成每个方法一个,Server端则由原本的低阶CALL命令转为语言本身所提供的动态呼叫功能。
这样的简化带来了效率,由于Client端不再经过动态转型与建立中介对象的动作,因此在效率上有显着的提升,也因为少了这些低阶的动作,内存管理上显得容易多了。
但这种方式却有着另外的几个缺点,由于Proxy Object的程序代码增加,相对的程序所占用的内存也随之变大,另外Server采用动态呼叫的方式来唤起方法,这种方式通常效率不高。
RemObjects SDK前面所提的两种模式皆有其优缺点,RO 在这方面则提出了另一个崭新的处理模式,下图是RO 的Server端处理模式:上图中大约与前面所提及的模式相同,其中不同之处在于Invoke Object,这是一个预先编译好的对象,其作用与.NET Web Services的Proxy Object相同,这个对象中所有方法都是Stub Method,将SOAP讯息转为参数后呼叫Real Object(Implement Object)的方法,完成后将参数转回讯息后返回Client端。
那么这种模式有何独到之处呢??答案是效率,整个动作之中看不到低阶的Stack或是动态呼叫,没有这些动作的加入,当然速度上也就加快不少。
RO 的Client端处理方式与Server端大同小异,因此结论是! RO 没有用到任何的中介技术,也没有用到任何语言独有的功能,这也是RO .NET 为何能在短短的几个月内就能完成的主要原因。
-----------------------------------以上摘自黄忠成下面对RO自带的代码CalcService进行分析:ROWinMessageServer1, TROIndyHTTPServer, TROIndyTCPServer服务器支持windowMsg, HTTP, TCP等连接方式:ROMessage: TROSOAPMessage; ROBINMessage1: TROBINMessage;支持SOAP, 和bin两种数据格式:RO支持多种连接方式和两种数据格式,具体请参考相应资料。
现在先分析服务器端和ROTCPClient客户端及相应的TROBINMessage。
打开CalcService服务器端之后,开始跟踪代码:unit uROTypes;initializationtype TRODataType = (rtInteger, rtDateTime, rtDouble, rtCurrency, rtWidestring, rtString,rtInt64, rtBoolean, rtVariant, rtBinary, rtUserDefined);定义了RO的相应的数据类型unit uROClient;_MessageClasses := TClassList.Create;_ExceptionClasses := TClassList.Create;用来注册Message和exception类。
procedure RegisterStringFormats(const StringFormats: array of TROStringFormatClass);unit uROProxy;initialization_ProxyClasses := TStringList.Create;//创建ProxyClassesunit uROServer;initializationAddTerminateProc(FinalizeClasses);_ServerClasses := TClassList.Create;_ClassFactoryList := nil;//创建成ServerClassesunit uROIndyTCPServer;initializationRegisterServerClass(TROIndyTCPServer);// TROIndyTCPServer 注册到ServerClasses列表中。
unit uROIndyHTTPServer;initializationRegisterServerClass(TROIndyHTTPServer);// TROIndyHTTPServer注册到ServerClasses列表中。
unit uROBINMessage;initializationRegisterMessageClass(TROBINMessage);// TROBINMessage注册到MessageClass列表中。
unit uROWinMessageServer;initializationRegisterServerClass(TROWinMessageServer);// TROWinMessageServer注册到MessageClass列表中。
然后到unit CalcLibrary_Intf;单元initializationRegisterProxyClass(CalcService_IID, TCalcService_Proxy);可以看到,注到到前面创建的_ProxyClass中。
_ProxyClasses := TStringList.Create;procedure RegisterProxyClass(const anInterfaceID : TGUID; aProxyClass : TROProxyClass); begin_ProxyClasses.AddObject(GUIDToString(anInterfaceID), TObject(aProxyClass))end;unit CalcService_Impl;initializationTROClassFactory.Create('CalcService', Create_CalcService, TCalcService_Invoker);这里是比较重要的地方:我们要把一些信息到TROClassFactory中注册。