创建 C++ 客户端
此示例说明如何使用 C 客户端 API 编写 MATLAB® Production Server™ 客户端。客户端应用 addmatrix
调用您在使用生产服务器存档编译器创建 MATLAB Production Server 存档 (MATLAB Compiler SDK)并部署在将存档部署至 MATLAB Production Server。
创建 C++ MATLAB Production Server 客户端应用程序:
创建一个名为
addmatrix_client.cpp
的文件。使用文本编辑器打开
addmatrix_client.cpp
。将以下包含语句添加到文件:
#include <iostream> #include <mps/client.h>
注意
MATLAB Production Server C 客户端 API 的头文件位于
文件夹中,其中$MPS_INSTALL
/client/c/include/mps$MPS_INSTALL
是安装 MATLAB Production Server 的根文件夹。将
main()
方法添加到应用程序。int main ( void ) { }
初始化客户端运行时。
mpsClientRuntime* mpsruntime = mpsInitializeEx(MPS_CLIENT_1_1);
创建客户端配置。
mpsClientConfig* config; mpsStatus status = mpsruntime->createConfig(&config);
创建客户端上下文。
mpsClientContext* context; status = mpsruntime->createContext(&context, config);
创建要输入到函数的 MATLAB 数据。
double a1[2][3] = {{1,2,3},{3,2,1}}; double a2[2][3] = {{4,5,6},{6,5,4}}; int numIn=2; mpsArray** inVal = new mpsArray* [numIn]; inVal[0] = mpsCreateDoubleMatrix(2,3,mpsREAL); inVal[1] = mpsCreateDoubleMatrix(2,3,mpsREAL); double* data1 = (double *)( mpsGetData(inVal[0]) ); double* data2 = (double *)( mpsGetData(inVal[1]) ); for(int i=0; i<2; i++) { for(int j=0; j<3; j++) { mpsIndex subs[] = { i, j }; mpsIndex id = mpsCalcSingleSubscript(inVal[0], 2, subs); data1[id] = a1[i][j]; data2[id] = a2[i][j]; } }
创建 MATLAB 数据来保存输出。
int numOut = 1; mpsArray **outVal = new mpsArray* [numOut];
调用已部署的 MATLAB 函数。
指定以下内容作为参量:
客户端上下文
函数 URL
预期输出数量
指向保存输出的
mpsArray
指针输入数目
指向保存输入的
mpsArray
的指针
mpsStatus status = mpsruntime->feval(context, "http://localhost:9910/addmatrix/addmatrix", numOut, outVal, numIn, (const mpsArray**)inVal);
有关
feval
函数的更多信息,请参阅
文件夹中包含的参考资料,其中$MPS_INSTALL
/client$MPS_INSTALL
是您的 MATLAB Production Server 安装文件夹的名称。使用
if
语句验证函数调用是否成功。if (status==MPS_OK) { }
在
if
语句中,添加代码来处理输出。double* out = mpsGetPr(outVal[0]); for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { mpsIndex subs[] = {i, j}; mpsIndex id = mpsCalcSingleSubscript(outVal[0], 2, subs); std::cout << out[id] << "\t"; } std::cout << std::endl; }
在
else
语句中添加if
子句来处理任何错误。else { mpsErrorInfo error; mpsruntime->getLastErrorInfo(context, &error); std::cout << "Error: " << error.message << std::endl; switch(error.type) { case MPS_HTTP_ERROR_INFO: std::cout << "HTTP: " << error.details.http.responseCode << ": " << error.details.http.responseMessage << std::endl; case MPS_MATLAB_ERROR_INFO: std::cout << "MATLAB: " << error.details.matlab.identifier << std::endl; std::cout << error.details.matlab.message << std::endl; case MPS_GENERIC_ERROR_INFO: std::cout << "Generic: " << error.details.general.genericErrorMsg << std::endl; } mpsruntime->destroyLastErrorInfo(&error); }
释放输入所使用的内存。
for (int i=0; i<numIn; i++) mpsDestroyArray(inVal[i]); delete[] inVal;
释放输出所使用的内存。
for (int i=0; i<numOut; i++) mpsDestroyArray(outVal[i]); delete[] outVal;
释放客户端运行时使用的内存。
mpsruntime->destroyConfig(config); mpsruntime->destroyContext(context); mpsTerminate();
保存文件。
完成的程序应该类似下图:
#include <iostream> #include <mps/client.h> int main ( void ) { mpsClientRuntime* mpsruntime = mpsInitializeEx(MPS_CLIENT_1_1); mpsClientConfig* config; mpsStatus status = mpsruntime->createConfig(&config); mpsClientContext* context; status = mpsruntime->createContext(&context, config); double a1[2][3] = {{1,2,3},{3,2,1}}; double a2[2][3] = {{4,5,6},{6,5,4}}; int numIn=2; mpsArray** inVal = new mpsArray* [numIn]; inVal[0] = mpsCreateDoubleMatrix(2,3,mpsREAL); inVal[1] = mpsCreateDoubleMatrix(2,3,mpsREAL); double* data1 = (double *)( mpsGetData(inVal[0]) ); double* data2 = (double *)( mpsGetData(inVal[1]) ); for(int i=0; i<2; i++) { for(int j=0; j<3; j++) { mpsIndex subs[] = { i, j }; mpsIndex id = mpsCalcSingleSubscript(inVal[0], 2, subs); data1[id] = a1[i][j]; data2[id] = a2[i][j]; } } int numOut = 1; mpsArray **outVal = new mpsArray* [numOut]; status = mpsruntime->feval(context, "http://localhost:9910/addmatrix/addmatrix", numOut, outVal, numIn, (const mpsArray **)inVal); if (status==MPS_OK) { double* out = mpsGetPr(outVal[0]); for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { mpsIndex subs[] = {i, j}; mpsIndex id = mpsCalcSingleSubscript(outVal[0], 2, subs); std::cout << out[id] << "\t"; } std::cout << std::endl; } } else { mpsErrorInfo error; mpsruntime->getLastErrorInfo(context, &error); std::cout << "Error: " << error.message << std::endl; switch(error.type) { case MPS_HTTP_ERROR_INFO: std::cout << "HTTP: " << error.details.http.responseCode << ": " << error.details.http.responseMessage << std::endl; case MPS_MATLAB_ERROR_INFO: std::cout << "MATLAB: " << error.details.matlab.identifier << std::endl; std::cout << error.details.matlab.message << std::endl; case MPS_GENERIC_ERROR_INFO: std::cout << "Generic: " << error.details.general.genericErrorMsg << std::endl; } mpsruntime->destroyLastErrorInfo(&error); } for (int i=0; i<numIn; i++) mpsDestroyArray(inVal[i]); delete[] inVal; for (int i=0; i<numOut; i++) mpsDestroyArray(outVal[i]); delete[] outVal; mpsruntime->destroyConfig(config); mpsruntime->destroyContext(context); mpsTerminate(); }
编译应用程序。
要编译您的客户端代码,编译器需要访问
client.h
。该头文件存储在$MPSROOT/client/c/include/mps/
中。要链接您的应用程序,链接器需要访问存储在
$MPSROOT/client/c/<arch>/lib/
中的以下文件:链接所需的文件
Windows® UNIX®/Linux Mac OS X $arch\lib\mpsclient.lib
$arch/lib/libprotobuf3.so
$arch/lib/libprotobuf3.dylib
$arch/lib/libcurl.so
$arch/lib/libcurl.dylib
$arch/lib/libmwmpsclient.so
$arch/lib/libmwmpsclient.dylib
$arch/lib/libmwcpp11compat.so
运行该应用程序。
要运行您的应用程序,请将存储在
$MPSROOT/client/c/<arch>/lib/
中的以下文件添加到应用程序的路径中:运行所需的文件
Windows UNIX/Linux Mac OS X $arch\lib\mpsclient.dll
$arch/lib/libprotobuf3.so
$arch/lib/libprotobuf3.dylib
$arch\lib\libprotobuf3.dll
$arch/lib/libcurl.so
$arch/lib/libcurl.dylib
$arch\lib\libcurl.dll
$arch/lib/libmwmpsclient.so
$arch/lib/libmwmpsclient.dylib
$arch/lib/libmwcpp11compat.so
客户端调用服务器实例上的
addmatrix
函数并在控制台返回以下矩阵:5.0 7.0 9.0 9.0 7.0 5.0