主要内容

创建一个c++客户端

这个例子展示了如何编写一个MATLAB®生产服务器™客户端使用C客户机API。客户端应用程序调用addmatrix你编译函数包部署档案与生产服务器编译器应用程序和部署在MATLAB存档部署到生产服务器(MATLAB生产服务器)

创建一个c++MATLAB生产服务器客户端应用程序:

  1. 创建一个文件名为addmatrix_client.cpp

  2. 使用一个文本编辑器,打开addmatrix_client.cpp

  3. 添加以下语句包括文件:

    # include < iostream > # include <议员/ client.h >

    请注意

    的头文件MATLAB生产服务器C客户机API位于matlabroot/工具箱/ compiler_sdk / mps_client / c / include /议员文件夹中。文件夹中。

  4. 添加main ()方法应用程序。

    int主要(空白){}
  5. 初始化客户端运行时。

    mpsClientRuntime * mpsruntime = mpsInitializeEx (MPS_CLIENT_1_1);
  6. 创建客户端配置。

    mpsClientConfig *配置;mpsStatus状态= mpsruntime - > createConfig(配置);
  7. 创建客户端上下文。

    mpsClientContext *上下文;状态= mpsruntime - > createContext(上下文配置);
  8. 创建MATLAB数据输入功能。

    双a1 [2] [3] = {{1,2,3}, {3、2、1}};双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);双* data1 =(双*)(mpsGetData (inVal [0]));双* data2 =(双*)(mpsGetData (inVal [1]));for (int i = 0;我< 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]; } }
  9. 创建MATLAB数据来控制输出。

    int numOut = 1;mpsArray * * outVal = new mpsArray * [numOut];
  10. 调用部署的MATLAB函数。

    指定以下参数:

    • 客户端环境

    • URL的函数

    • 数量的预期输出

    • 指针mpsArray的输出

    • 输入数量

    • 指针mpsArray持有的输入

    mpsStatus状态= mpsruntime - >函数宏指令(上下文,“http://localhost: 9910 / addmatrix / addmatrix numOut, outVal, numIn, (const mpsArray * *) inVal);

    更多的信息函数宏指令功能,请参见参考资料中matlabroot/工具箱/ compiler_sdk / mps_client文件夹中。

  11. 确认使用一个函数调用成功如果声明。

    如果状态= = MPS_OK) {}
  12. 如果声明中,添加代码来处理输出。

    双* = mpsGetPr (outVal [0]);for (int i = 0;我< 2;我为(+ +){int j = 0;j < 3;j + +) {mpsIndex潜艇[]= {i, j};mpsIndex id = mpsCalcSingleSubscript (outVal[0], 2,潜艇);std:: cout < < (id) < <“\ t”;}std:: cout < < std:: endl;}
  13. 添加一个其他的条款的如果语句来处理任何错误。

    其他{mpsErrorInfo错误;mpsruntime - > getLastErrorInfo(上下文,& error);std:: cout < <“错误:”< <错误。信息< < std:: endl;开关(error.type){案例MPS_HTTP_ERROR_INFO: std:: cout < < " HTTP: " < < ": " < < < < error.details.http.responseCode error.details.http.responseMessage < < std:: endl;案例MPS_MATLAB_ERROR_INFO: std:: cout < <“MATLAB:“< < error.details.matlab.identifier < < std:: endl;std:: cout < < error.details.matlab.message < < std:: endl;案例MPS_GENERIC_ERROR_INFO: std:: cout < <“一般:“< < error.details.general.genericErrorMsg < < std:: endl;}mpsruntime - > destroyLastErrorInfo (& error);}
  14. 释放内存使用的输入。

    for (int i = 0;我< numIn;我+ +)mpsDestroyArray (inVal[我]);删除[]inVal;
  15. 免费使用的内存输出。

    for (int i = 0;我< numOut;我+ +)mpsDestroyArray (outVal[我]);删除[]outVal;
  16. 免费客户端运行时所使用的内存。

    mpsruntime - > destroyConfig(配置);mpsruntime - > destroyContext(上下文);mpsTerminate ();
  17. 保存文件。

    完成的程序应该类似于下面的:

    # include < iostream > # include <议员/ 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; idestroyConfig(config); mpsruntime->destroyContext(context); mpsTerminate(); }
  18. 编译应用程序。

    编译你的客户代码,编译器需要访问client.h。这个头文件是存储在matlabroot/工具箱/ compiler_sdk / mps_client / c / include /议员/

    应用程序链接,链接器需要访问存储在以下文件matlabroot/工具箱/ compiler_sdk / mps_client / c /:

    所需文件链接

    窗户® UNIX®/ Linux Mac OS X
    拱\ lib \ mpsclient.lib美元 arch / lib / libprotobuf.so美元 arch / lib / libprotobuf.dylib美元
    arch / lib / libcurl.so美元 arch / lib / libcurl.dylib美元
    arch / lib / libmwmpsclient.so美元 arch / lib / libmwmpsclient.dylib美元
    arch / lib / libmwcpp11compat.so美元
  19. 运行应用程序。

    运行您的应用程序中,添加以下文件中存储matlabroot/工具箱/ compiler_sdk / mps_client / c /应用程序的路径:

    文件要求运行

    窗户 UNIX / Linux Mac OS X
    拱\ lib \ mpsclient.dll美元 arch / lib / libprotobuf.so美元 arch / lib / libprotobuf.dylib美元
    拱\ lib \ libprotobuf.dll美元 arch / lib / libcurl.so美元 arch / lib / libcurl.dylib美元
    拱\ 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