主要内容

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

使用 RMI 运行客户端和服务器

此示例说明如何实现 RMI 来运行两个初始化 MATLAB® 结构体数组的独立进程。客户端和服务器在同一台计算机上运行。

要使用一台计算机上的客户端和另一台计算机上的服务器来实现 RMI,请使用此示例中的过程并:

  1. 更改服务器与系统注册表的绑定方式。

  2. 重新定义客户端如何访问服务器。

RMI 前提条件

要运行此示例,您的环境必须满足以下前提条件:

  • 在开发计算机上安装 MATLAB Compiler SDK™

  • 在开发计算机上安装受支持的 Java® 开发工具包 (JDK™) 版本。有关详细信息,请参阅配置用于生成 Java 包的环境

  • 在 Web 服务器上安装 MATLAB Runtime。有关详细信息,请参阅下载并安装 MATLAB Runtime

  • 确保您的 Web 服务器能够运行公认的 Java 框架(例如 J2EE)。

  • javabuilder.jar 库 (matlabroot/toolbox/javabuilder/jar/javabuilder.jar) 安装到 Web 服务器的通用库文件夹中。

    如果您的实现使用单独的客户端计算机,那么它们也需要 javabuilder.jar,因为它包含 com.mathworks.extern.java 包。

注意

您不需要在客户端安装 MATLAB Runtime。可以使用 boolean marshalOutputs 类中的 RemoteProxy 自动转换 MATLAB Runtime 的返回值。有关详细信息,请参阅 matlabroot/help/toolbox/javabuilder/MWArrayAPI 中的 Javadoc API 文档。

文件

MATLAB 函数位置matlabroot\toolbox\javabuilder\Examples\RMIExamples\DataTypes\DataTypesDemoComp
Java 代码位置matlabroot\toolbox\javabuilder\Examples\RMIExamples\DataTypes\DataTypesDemoJavaApp

过程

  1. DataTypes 文件夹从 MATLAB 复制到您的工作文件夹:

    copyfile(fullfile(matlabroot,'toolbox','javabuilder','Examples','RMIExamples','DataTypes'))

    在 MATLAB 命令提示符下,导航到工作文件夹中的新 DataTypes\DataTypesDemoComp 子文件夹。

  2. 检查 MATLAB 函数 createEmptyStruct.mupdateField.m

     createEmptyStruct.m

     updateField.m

  3. 通过在 Java 命令提示符下发出以下命令,使用 compiler.build.javaPackage 生成 MATLAB 包:

    compiler.build.javaPackage({'createEmptyStruct.m','updateField.m'}, ...
        'PackageName','dataTypesComp', ...
        'ClassName','dataTypesClass', ...
        'Verbose','on');

    有关详细信息,请参阅生成 Java 包并编译 Java 应用程序中的说明。

  4. 在系统命令提示符下,导航到 DataTypes\DataTypesDemoJavaApp 文件夹。

    通过在系统命令提示符下发出以下 javac 命令之一来编译服务器 Java 代码。

    • 在 Windows® 上,键入:

      javac -classpath
       "matlabroot\toolbox\javabuilder\jar\javabuilder.jar;path\to\dataTypesComp.jar"
       DataTypesServer.java 
    • 在 UNIX® 上,键入:

      javac -classpath
       "matlabroot/toolbox/javabuilder/jar/javabuilder.jar:path/to/dataTypesComp.jar"
       DataTypesServer.java

    注意

    matlabroot 替换为 MATLAB 或 MATLAB Runtime 安装文件夹的路径。

  5. 通过在系统命令提示符下发出以下 javac 命令之一来编译客户端 Java 代码。

    • 在 Windows 上,键入:

      javac -classpath
       "matlabroot\toolbox\javabuilder\jar\javabuilder.jar;path\to\dataTypesComp.jar
       DataTypesClient.java
    • 在 UNIX 上,键入:

      javac -classpath
       "matlabroot/toolbox/javabuilder/jar/javabuilder.jar:path/to/dataTypesComp.jar"
       DataTypesClient.java

运行客户端和服务器

运行客户端和服务器如下:

  1. 打开两个命令行窗口 - 一个用于服务器,一个用于客户端。

  2. 在每个窗口中,分别导航到包含 DataTypesServer.javaDataTypesClient.java 文件夹。

  3. 通过在系统命令提示符下以一行形式发出以下 java 命令之一来运行服务器。

    • 在 Windows 上,键入:

      java -classpath
       .;"path\to\dataTypesComp.jar;matlabroot\toolbox\javabuilder\jar\javabuilder.jar"
       -Djava.rmi.server.codebase="file:///matlabroot\toolbox\javabuilder\jar\javabuilder.jar
       file:///path\to\dataTypesComp.jar" DataTypesServer
    • 在 UNIX 上,键入:

      java -classpath
       .:"path/to/dataTypesComp.jar;matlabroot/toolbox/javabuilder/jar/javabuilder.jar"
       -Djava.rmi.server.codebase="file:///matlabroot/toolbox/javabuilder/jar/javabuilder.jar
       file:///path/to/dataTypesComp.jar" DataTypesServer

  4. 在第二个命令行窗口中,通过在一行中发出以下 java 命令之一来运行客户端。

    • 在 Windows 上,键入:

      java -classpath
       .;"path/to/\dataTypesComp.jar;matlabroot\toolbox\javabuilder\jar\javabuilder.jar"
       DataTypesClient
    • 在 UNIX 上,键入:

      java -classpath
       .:"path/to/dataTypesComp.jar;matlabroot/toolbox/javabuilder/jar/javabuilder.jar"
       -Djava.rmi.server.codebase="file:///matlabroot/toolbox/javabuilder/jar/javabuilder.jar
       file:///path/to/dataTypesComp.jar" DataTypesClient

如果命令执行成功,则运行服务器的命令行窗口中会出现以下输出:

Please wait for the server registration notification.            
            Server registered and running successfully!!

            EVENT 1: Initializing the structure on server
                     and sending it to client:
                     Initialized empty structure:

                   Name: []
                Address: []

            ##################################

            EVENT 3: Partially initialized structure as received by server:

                   Name: []
                Address: [1x1 struct]

            Address field as initialized from the client:

                Street: '3, Apple Hill Drive'
                  City: 'Natick'
                 State: 'MA'
                   Zip: '01760'

            ##################################

            EVENT 4: Updating 'Name' field before 
                     sending the structure back to the client:

                  Name: 'The MathWorks'
               Address: [1x1 struct]

            ##################################
运行客户端的命令行窗口中会出现以下输出:
 Running the client application!!

            EVENT 2: Initialized structure as received in client applications:

                   Name: []
                Address: []

            Updating the 'Address' field to :

                Street: '3, Apple Hill Drive'
                  City: 'Natick'
                 State: 'MA'
                   Zip: '01760'

            #################################


            EVENT 5: Final structure as received by client:

                   Name: 'The MathWorks'
                Address: [1x1 struct]

            Address field:

                Street: '3, Apple Hill Drive'
                  City: 'Natick'
                 State: 'MA'
                   Zip: '01760'

            #################################

注意

有关 RMI 实现的更多示例,请参阅 matlabroot/toolbox/javabuilder/Examples/RMIExamples 中的文件。

另请参阅

主题