主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

创建 C++ 客户端

此示例说明如何使用 C 客户端 API 编写 MATLAB® Production Server™ 客户端。客户端应用 addmatrix 调用您在使用生产服务器存档编译器创建 MATLAB Production Server 存档 (MATLAB Compiler SDK)并部署在将存档部署至 MATLAB Production Server

创建 C++ MATLAB Production Server 客户端应用程序:

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

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

  3. 将以下包含语句添加到文件:

    #include <iostream>
    #include <mps/client.h>

    注意

    MATLAB Production Server C 客户端 API 的头文件位于 $MPS_INSTALL/client/c/include/mps 文件夹中,其中 $MPS_INSTALL 是安装 MATLAB Production Server 的根文件夹。

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

    int main ( void )
    {
    } 
  5. 初始化客户端运行时。

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

    mpsClientConfig* config;
    mpsStatus status = mpsruntime->createConfig(&config);
  7. 创建客户端上下文。

    mpsClientContext* context;
    status = mpsruntime->createContext(&context, config);
  8. 创建要输入到函数的 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];
      }
    }
    
  9. 创建 MATLAB 数据来保存输出。

    int numOut = 1;
    mpsArray **outVal = new mpsArray* [numOut];
  10. 调用已部署的 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 安装文件夹的名称。

  11. 使用 if 语句验证函数调用是否成功。

    if (status==MPS_OK)
    {
    }
    
  12. 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;
    }
  13. 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);
    }
  14. 释放输入所使用的内存。

    for (int i=0; i<numIn; i++)
      mpsDestroyArray(inVal[i]);
    delete[] inVal;
    
  15. 释放输出所使用的内存。

    for (int i=0; i<numOut; i++)
      mpsDestroyArray(outVal[i]);
    delete[] outVal;
    
  16. 释放客户端运行时使用的内存。

    mpsruntime->destroyConfig(config);
    mpsruntime->destroyContext(context);
    mpsTerminate();
    
  17. 保存文件。

    完成的程序应该类似下图:

    #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();
    }
  18. 编译应用程序。

    要编译您的客户端代码,编译器需要访问 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  
  19. 运行该应用程序。

    要运行您的应用程序,请将存储在 $MPSROOT/client/c/<arch>/lib/ 中的以下文件添加到应用程序的路径中:

    运行所需的文件

    WindowsUNIX/LinuxMac 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