ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:134.07KB ,
资源ID:6369707      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6369707.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(XMLRPC 实现C++和C#交互.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

XMLRPC 实现C++和C#交互.docx

1、XMLRPC 实现C+和C#交互一.方案介绍 解决不同语言交互的方法有不少,对我了解的windows系统和.NET平台,有以下几种做法: P/Invoke: 调用native cpp的方法,处在同一个内存区间,访问方便,但包装困难,可能抛出运行时异常。 读写文件:通过一头读文件,一头写文件的方式实现交互。诸位别笑,本科时候我就用过这种方式解决问题。 命名管道/socket: 通过字节数组的方式实现交互,命名管道是windows系统提供的功能,可提供安 全快捷的程序间交互。socket不依赖于操作系统,只要给定包格式,在任何支持socket的语言平台下都能支持。但缺点也很明显,如果交互复杂,那么

2、 解析这种byte数组将会非常复杂而且难以维护。 RPC: 又称之为远程过程调用,也是我们今天的主角。 数据即程序,RPC说白了依旧是传递数据的过程,只是过程在代码上更像函数调用。如下图: 目前主流的RPC有两种: XML和JSON。 XML是曾经的主角,兼容性更好。但如今移动互联网要求数据流量要小,而XML的缺点也随之暴露出来,JSON由于节省数据(大大减少了包头和标记的开 销),如今变得更受欢迎。新浪微博API,如今全部升级为JSON了。 RPC的实质是http协议,它封装了底层实现的细节,能让我们将注意力放在应用逻辑的实现,而非建立连接这样的问题。 RPC的优点很多,其中我最喜欢的是它的

3、容器,声明一个Array,里面可以塞任何你想要的数据,int,string,double,struct甚至另外一个array都可以。当然,不能传递抽象类或接口,毕竟不是同一内存区域。 本文我们只介绍XML-RPC实现C+和C#两个应用程序之间的交互。JSON的C#版本Jayrock对RPC的支持,尤其是对非ASP.NET环境几乎没有,连一篇像样的文档都找不到,所以我们仅仅讨论XML-RPC。二. 方案实现 我们打算将C#作为客户端,C+作为服务器端。 1. C+的服务器实现 我们在VS2010中新建C+工程,将附件中的XMLRPC.LIB静态库拷入当前工程文件夹,设置当前工程为release模

4、式。同时在C+工程设置中,添加两个lib引用: xmlrpc.lib, ws2_32.lib之所以用release模式,是因为在debug模式下xmlrpc.lib库会出现如下的编译错误:花了很久时间都没解决,如果有大神能帮助解决这个问题,请一定留言.1 All outputs are up-to-date.1XmlRpc.lib(XmlRpcServer.obj) : error LNK2038: mismatch detected for _ITERATOR_DEBUG_LEVEL: value 0 doesnt match value 2 in HelloServer.obj1XmlRp

5、c.lib(XmlRpcUtil.obj) : error LNK2038: mismatch detected for _ITERATOR_DEBUG_LEVEL: value 0 doesnt match value 2 in HelloServer.obj1XmlRpc.lib(XmlRpcServerMethod.obj) : error LNK2038: mismatch detected for _ITERATOR_DEBUG_LEVEL: value 0 doesnt match value 2 in HelloServer.obj1XmlRpc.lib(XmlRpcValue.

6、obj) : error LNK2038: mismatch detected for _ITERATOR_DEBUG_LEVEL: value 0 doesnt match value 2 in HelloServer.obj1XmlRpc.lib(XmlRpcDispatch.obj) : error LNK2038: mismatch detected for _ITERATOR_DEBUG_LEVEL: value 0 doesnt match value 2 in HelloServer.obj1XmlRpc.lib(XmlRpcServerConnection.obj) : err

7、or LNK2038: mismatch detected for _ITERATOR_DEBUG_LEVEL: value 0 doesnt match value 2 in HelloServer.obj1XmlRpc.lib(XmlRpcSocket.obj) : error LNK2038: mismatch detected for _ITERATOR_DEBUG_LEVEL: value 0 doesnt match value 2 in HelloServer.obj1XmlRpc.lib(XmlRpcSource.obj) : error LNK2038: mismatch d

8、etected for _ITERATOR_DEBUG_LEVEL: value 0 doesnt match value 2 in HelloServer.obj再将对应的库头文件加入到项目中,完成后如下图所示:现在C#程序员普遍已经忘掉了怎么编译和使用C+静态库,我也是其中之一,如果你在上面几步遇到困难,不妨查看相关资料。接下来,我们将开始编写工作代码:首先是添加头文件引用,一般只要引用XMLRPC.H和XMLRPCVALUE.H即可, 同时声明一个全局的XmlRpcServer 服务。(实在太不习惯C+中不new就能创建实例的语法了)#include RPC/XmlRpc.h#inclu

9、de RPC/XmlRpcValue.h#include #include using namespace XmlRpc;/ The serverXmlRpcServer s;添加主函数:int main() /*if (argc != 2) std:cerr Usage: HelloServer serverPortn; return -1; */ /int port = atoi(argv1); int port=2567; XmlRpc:setVerbosity(3); / Create the server socket on the specified port s.bindAndL

10、isten(port); / Enable introspection s.enableIntrospection(true); / Wait for requests indefinitely s.work(-1.0); return 0;设置端口,绑定端口和启动.这些都没什么好说的。值得注意的是调试等级,setVerbosity。等级越高,输出信息越详细,最高等级可输出完整的xml交互文件供调试,但会严重拖累系统速度的。在你测试功能完毕后,不妨将其设为0。 接下来我们创建几个类,来实现服务端功能:/ A variable number of arguments are passed, al

11、l doubles, result is their sum.class Sum : public XmlRpcServerMethodpublic: Sum(XmlRpcServer* s) : XmlRpcServerMethod(Sum, s) void execute(XmlRpcValue& params, XmlRpcValue& result) int nArgs = params.size(); double sum = 0.0; for (int i=0; inArgs; +i) sum += double(paramsi); result = sum; sum(&s); 所

12、有功能都以继承于XmlRpcServerMethod类,同时改写其execute函数。 有点意思的是,这个XmlRPCValue数据类型,是类似C#的Dictionary,或JAVA的hashset。 你可以通过类似C#索引器(字典)的方式,添加或读取该结构中的内容。比如上面的paramsi。由于代码简单,就不多做详细解释。 类后跟了一个实例,sum(&s),这样就在服务器中注册了该功能。 再创建一个类,来实现字符串操作:/ One argument is passed, result is Hello, + arg.class HelloName : public XmlRpcServerM

13、ethodpublic: HelloName(XmlRpcServer* s) : XmlRpcServerMethod(HelloName, s) void execute(XmlRpcValue& params, XmlRpcValue& result) std:string resultString = Hello, ; resultString += std:string(params0); result = resultString; helloName(&s); 也不多做解释了。 我们再看一下,怎么存取RPC中的字典和数组,这才是精髓部分:class StructData : pu

14、blic XmlRpcServerMethodpublic: StructData(XmlRpcServer* s) : XmlRpcServerMethod(GetStruct, s) void execute(XmlRpcValue& params, XmlRpcValue& result) XmlRpcValue A; A.setSize(2); A0a=123; A0b=456; A1a=43; A1b=425; resulta=A; resultb=123; structData(&s); 设置字典时,是不需要指定其size的,但若设定的是数组,则必须使用setsize方法设定其大小

15、。字典的值也可包含另外一个XmlRpcValue 结构体。 RPC中可以很好的处理字符串,int,double, datetime类型,但枚举类型的支持并不好,我建议直接传int. 完成了这三个服务后,我们来编写C#的客户端。 2. C# RPC客户端实现: 新建一个C#工程,创建以下的接口类:public interface IRPCMethod XmlRpcMethod(HelloName) string HelloName(string Name); XmlRpcMethod(Sum) double Sum(double a,double b); XmlRpcMethod(GetStru

16、ct) XmlRpcStruct GetStruct(); 当然,要引用CookComputing.XmlRpc库。 使用接口类的作用是剥离RPC对系统的影响,让系统可以“透明的”调用RPC代码。值得注意的是,名称必须与C+中的名称一致,否则会出现找不到方法的异常。 我们注册客户端服务:var chnl = new HttpChannel(null, new XmlRpcClientFormatterSinkProvider(), null); ChannelServices.RegisterChannel(chnl, false); var svr = (IRPCMethod)Activat

17、or.GetObject(typeof(IRPCMethod), http:/localhost:2567/); Console.WriteLine(成功注册信道); string ret = svr.HelloName(haha); Console.WriteLine(调用helloName方法: + ret); double result = svr.Sum(23, 18); Console.WriteLine(调用Sum方法: + result.ToString(); XmlRpcStruct result2 = svr.GetStruct(); 至于result2结构体,你可以通过调试

18、来查看具体的运行结果。 在服务器端,可以看到调用所花费的流量和方法名称。三. 其他这里我们关注一些额外的问题:1.流量 RPC的一种场景是本地不同程序调用,这种情况下速度很快。但在跨机器或是移动设备上,就必须考虑流量因素了。XML的“性价比”并不高: echo Hello Chris 123 实际的有用数据,仅占所有字节数的5%,甚至更少,除非是大批量的传输本文数据。如果是流量敏感,推荐使用JSON. 2. 性能 我们当然要关心,RPC在本机调用会有多快?和哪些因素敏感? 笔者配置是i7 2600K, 8GB DDR, Gbps网络适配器,VS的debug模式。在执行Sum操作时,一千次耗时4

19、.3ms。 在执行更复杂的结构体传递(大概有20个double,三个string,两个int时), 千次耗时5.8ms。 因此,可以得知,XML的转换和解析几乎不耗时,建立连接后,执行一次在ms量级,对数据结构复杂程度不敏感,因此,若是实时性敏感应用,建议一次性多传些数据。 3. 兼容性 笔者发现,RPC的兼容性并不太好,在和JAVA采用RPC交互时,就遇到了困难,”XML解析异常”。JSON的的兼容性不见得比XML更好,实际操作 更是问题多多。涉及RPC的社区,普遍文档较少,例子不全,出现问题也不好排查,更没有太多跨语言的RPC实例。因此,如果你能用P/Invoke, 还是推荐用直接调用的做法。 RPC肯定还是比byte流的socket方便很多。 四 .总结和源代码下载 RPC将原本复杂的数据传输问题简化了,使我们从复杂的数据包结构,JAVA和C的double编码和socket传输中脱离出来,提供了更简单方便的方案。但必须看到,它并不完善,我们只能一步步的探索。 另外想问一句,Unity3D的RPC是何种格式? 有任何问题,欢迎随时交流。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1