一、本地调用
本地调用又两个方面阐述,一是不同进程(不同进行语言可能不一样)之间的通信;二是不同语言本地调用,这一点举了几种常用的语言调用,其他的不再累赘:
1、不同进程之间主要通过以下方式进行通信(IPC调用)
进程间通信(IPC,InterProcessCommunication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上的两个进程IPC。
2、C++跨语言调用Java
JavaJDK提供了JNI接口供C/C++程序调用Java编译后的类与方法,主要依赖于头文件(jni.h)和动态库(jvm.so/jvm.dll),JNI包含了丰富的接口映射和跨语言的数据通信,非常复杂。
3、C、C++中调用Python
通过C++调用Python脚本,主要利用Python提供的API,实际上,C++主要调用的是Python的解释器,而Python的解释器本质就是实现在动态链接库里的,因此在调用前后要进行一些初始化和资源释放的工作,另外,要调用Python脚本里的函数等等,需要使用Python提供的一些特殊的API来包装C++调用。比如:
- 初始化Python解释器,若初始化失败,继续调用会出现各种错误
voidPy_Initialize(void)
检查Python解释器是否初始化,返回0表示没有经过初始化
intPy_IsInitialized(void)
反初始化解释器,包括子解释器,同时释放Python解释器占用的资源
voidPy_Finalize()
实际上是一个宏,执行Python代码
intPyRun_SimpleString(constchar*command)
导入一个模块,name是Python文件的文件名,不带.py,类似于Python内建的import
PyObject*PyImport_ImportModule(char*name)
相当于Python模块对象的dict属性,得到模块名称空间下的字典对象
PyObject*PyModule_GetDict(PyObject*module)
执行一段Python代码
PyObject*PyRun_String(constchar*str,intstart,PyObject*globals,PyObject*locals)
把Python数据类型转换为C的类型
intPyArg_Parse(PyObject*args,char*format,…)
返回模块对象o的attr_name属性或函数,相当于Python中的表达式o.attr_name
PyObject*PyObject_GetAttrString(PyObject*o,char*attr_name)
构建一个参数列表,将C类型转换为Python对象
PyObject*Py_BuildValue(char*format,…)
调用Python函数,两个参数都是Python对象指针,pfunc是要调用的Python函数,一般来说,可以用过PyObject_GetAttrString()获得,pargs是函数的参数列表,通常是Py_BuildValue()来构建的
PyObject*PyEval_CallObject(PyObject*pfunc,PyObject*pargs)
4、C#调用的C++库
提供了三种调用方式
(1)直接调用C++类库中的公共方法
使用DllImport特性对方法进行调用,比如一个C++类库SampleCppWrapper.dll中的公共方法:
extern“C”__declspec(dllexport)int__stdcallAdd(intn1,intn2);
__stdcall表示调用约定:参数都是从右向左通过堆栈传递,函数调用在返回前要由被调用者清理堆栈。
在C#中,调用如下:
[DllImport(“SampleCppWrapper.dll”)]privatestaticexternintAdd(intn1,intn2);
注意参数的类型,之后,可直接在C#编程中使用这个方法。
(2)调用C++类库中的类的方法
C#不能直接调用C++类库中的类,需要一种变通的解决方式,通过再做一个C++类库把要调用的类成员方法暴露出来
(3)使用C++类库中的回调函数
C++的回调函数是一种事件响应机制,和C#的委托相似,比如一个C++类中的回调函数:个人感觉与方法二大同小异,没有深入去探究,所以也就不太清楚功能上的优劣
二、远程调用
就是各种RPC了,RPC(RemoteProcedureCall)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
其中客户机,服务器都可能是不同的语言,也有可能相同。他们通过RPC实现了互通
目前常用的RPC协议有哪些呢?主要有CORBA,JavaRMI,WebService,Hessian,Thrift,XML-RPC,SOAP,HTTP等