怎样调用远程的函数 ( 积分: 100 )

  • 主题发起人 主题发起人 muhx
  • 开始时间 开始时间
M

muhx

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样调用另外远程的方法?
比如你本地要调用一个函数function GetNameByIndex(const AIndex: Integer; out AName: string);
而这个函数的具体实现代码在远程电脑上。

请不要使用COM/DCOM/COM+、CORBA等,用自己的代码实现

我的想法是将方法名字,参数打包传递给服务器,服务器负责解包,然后调用服务器上的相应方法

现在遇到的问题是假设参数不是一个简单类型的怎么办?比如是一个对象,或者动态数组,或者指针

我想自己实现这个类似中间件的功能,请给个思路。
 
难道分不够???
 
呵呵,怎么不用COM了?
类似于先把参数保存到文件,然后在另一个程序里把文件打开还原,动态数组、指针都应该没问题吧,对象麻烦点,如果两边类定义相同,创建一个新对象,然后所有属性通过参数赋值,就是一样的对象了。
 
楼上说的有道理,corba就是这么实现的,但用的不是用文件来传,而是直接打包成数据包传输,再解开。
 
按照楼上两位说的思路,现在我有两个难点
1。如何通过函数名(字符串)快速找到类中的实际函数
2。如果使用Socket采用异步方式(非阻塞)传输,怎么保证函数返回的结果快速对应调用的函数
比如客户端调用function GetNameByIndex(const AIndex: Integer; out AName: string): Boolean;
打包发送之后应该会立刻返回
等服务器响应后将结果传给客户端,客户端解包后怎么知道是哪个调用它的

谢谢大家
 
您可以关注一下 TFiler 和派生类 TReader、TWriter 来完成对象数据的读取和重构。
还有ReadComponentRes和WriteComponentRes,好像是针对TComponent的。
 
abszo中间件里的demo例子,你没仔细看?还是看不明白?
 
你就是想快速找到对应而已,对吧。
GetNameByIndex也就14个字符,字符串比较也不慢阿。
你试试用delphi写一个在TStringList里面查找一个字符串的函数,你看慢不慢,
当然比器整数查找来说,肯定慢一点。但是相对而言,你是做中间件,你一秒中有没有调用1万次?没有的话,那这个字符串查找所消耗的资源,那是相当地小滴。
 
再者说了,你的中间件有几个函数?
比如100个,你在100个单词里面找一个单词,字符串查找也是很快的了,相对来说,看你把功夫下在什么地方咯。
 
那你用Web Service吧
 
abszo,谢谢
你的中间件设计的很好
让我受到很大的启发
希望你早日完成正式版
我也会帮你测试
大家都鞭策着你所以不要偷懒啊:)

但是对于技术来说
我还是更倾向于知其所以然
所以我才想通过请教各位高手知道更多的细节
我想只有知道了他是怎样设计的,才能更好的使用

期望以后能得到大家更多的帮助谢谢

对于通过字符串来寻找函数
我想比较快的方法应该是使用哈希表
但是现在我还没有比较好的算法
比如用户自己定义了一个类
难道我们要为它类中的每一个函数都写一个编码、解码的代理吗?
有没有更通用的方法呢?
若这个类函数是继承得到的
比如
TBase = class
public
function BaseFunc: Boolean;
end;

TChild = class(TBase)
public
function ChildFunc: Boolean;
end;
那么用户调用
AChild: TChild;
...
AChild.BaseFunc的时候,因为我们没有处理BaseFunc这个函数,那么这种情况下我们怎么处理呢?
谢谢
 
你的这个概念太先进了,看来我要把你这个概念“据为己有”才行,得研究研究才行。
 
abszo你太谦虚了
我看过你的中间件,设计的架构非常好,很多设计的细节我还想不通,还需要以后不断向你请教。
Delphi实现Web Services就用到了利用字符串启动方法,好像是使用了RTTI信息
 
用web serverces的技术
直接把远程需要使用到的函数弄到一个单元 提供一个接口
本地的就调用服务器上的接口服务就可以了
 
我主要想知道其中的原理,谢谢暗夜中独舞
我觉得小的应用用不到Web Service
而且我也不明白为什么采用这么大的文本格式来封包
 
关于最后一点,推荐看李维 《Delphi6 SOAP Web Service程序设计篇》
http://www.delphifans.com/SoftView/SoftView_205.html
里面循序渐进地解释了这个封包是怎样根据需要一点一点添加起来的。
我觉得虽然您用不上ws,但ws看完后绝对有很多思想和实现方法能使您开窍。
那本书我也只看了2天就看完了。
 
楼上提到的书,看了关键的部分,它是用RTTI来解决的。有两个问题:
1、RTTI需要编译器的支持的,如果你要自己做一个中间件,如果让编译器产生的什么表为你所用?
2、不同编译器的RTTI所包含的信息不同,很难不到通用。
看来有点难度。
如果你要基于函数调用的话,让用户注册函数名与入口地址的对应表,然后根据名字找到入口,就可以调用了。至于参数嘛,还得研究研究。
 
hi, 如果自己实现通过RTTI来反射,我是没做过。
不过SOAP是跨平台跨语言的,只要两端分别实现这个协议的转换即可。
我觉得您的应用应该是SOAP的一个子集,不知您的场景如何,为何不拿来就用?
如果要自己做的话,难度和工作量的确不小。因为Borland也是专门一个组在做这个的。
李维的书里也写道,Borland肯定是一批天才的程序员在实现SOAP。。。。
 
李维 《Delphi6 SOAP Web Service程序设计篇》我看了好几天也没有看完
唉,水平还是太差了

对于远程调用我有了一些思路
但是对于参数还是有些困惑
简单类型的,比如Integer,Boolean等还好说,直接作为数据传递就可以了
对象该怎么传呢?
比如传递一个ADOQuery,那么是不是将整个对象都传递过去呢?
还有指针类型的怎么传递呢?也是传递指针指向的数据吗?

另外一个问题是如果需要返回怎么做呢?我想到的是这样的流程:
1。对函数进行封包
2。使用Socket将数据传递给服务端
3。服务端解包
4。服务端根据解包结果调用服务(函数)
5。服务端将结果回传给客户端
6。客户端在调用处得到回传结果,继续接下来的工作

这样就面临一个问题
客户端在调用的时候是否要使用阻塞,等待服务端将计算结果回传后才继续下面的工作
若不是使用阻塞,那么回传结果怎么正确找到调用它的位置呢?

谢谢大家的回答
4。
 
你要传对象得话,那你得对象要实现一个串行化接口,MFC,或java就这么干的。即你这个对象能将数据存到段内存,还能从内存读取数据并初始化自己。
调用阻塞与否,这是问题吗?你两个都实现不结了?
如果不阻塞,则需要自己查询返回结果。你看谁不是这么实现的,都这么做的。
你想把一个adoquery传过去,还有指针,呵呵,我觉得,比较困难。
 
后退
顶部