使用 RMI 运行客户端和服务器
此示例说明如何实现 RMI 来运行两个初始化 MATLAB® 结构体数组的独立进程。客户端和服务器在同一台计算机上运行。
要使用一台计算机上的客户端和另一台计算机上的服务器来实现 RMI,请使用此示例中的过程并:
更改服务器与系统注册表的绑定方式。
重新定义客户端如何访问服务器。
RMI 前提条件
要运行此示例,您的环境必须满足以下前提条件:
在开发计算机上安装 MATLAB Compiler SDK™。
在开发计算机上安装受支持的 Java® 开发工具包 (JDK™) 版本。有关详细信息,请参阅配置用于生成 Java 包的环境。
在 Web 服务器上安装 MATLAB Runtime。有关详细信息,请参阅下载并安装 MATLAB Runtime。
确保您的 Web 服务器能够运行公认的 Java 框架(例如 J2EE)。
将
javabuilder.jar库 () 安装到 Web 服务器的通用库文件夹中。matlabroot/toolbox/javabuilder/jar/javabuilder.jar如果您的实现使用单独的客户端计算机,那么它们也需要
javabuilder.jar,因为它包含com.mathworks.extern.java包。
注意
您不需要在客户端安装 MATLAB Runtime。可以使用 boolean marshalOutputs 类中的 RemoteProxy 自动转换 MATLAB Runtime 的返回值。有关详细信息,请参阅 中的 Javadoc API 文档。matlabroot/help/toolbox/javabuilder/MWArrayAPI
文件
| MATLAB 函数位置 | |
| Java 代码位置 | |
过程
将
DataTypes文件夹从 MATLAB 复制到您的工作文件夹:copyfile(fullfile(matlabroot,'toolbox','javabuilder','Examples','RMIExamples','DataTypes'))
在 MATLAB 命令提示符下,导航到工作文件夹中的新
DataTypes\DataTypesDemoComp子文件夹。检查 MATLAB 函数
createEmptyStruct.m和updateField.m。通过在 Java 命令提示符下发出以下命令,使用
compiler.build.javaPackage生成 MATLAB 包:compiler.build.javaPackage({'createEmptyStruct.m','updateField.m'}, ... 'PackageName','dataTypesComp', ... 'ClassName','dataTypesClass', ... 'Verbose','on');有关详细信息,请参阅生成 Java 包并编译 Java 应用程序中的说明。
在系统命令提示符下,导航到
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
注意
将
替换为 MATLAB 或 MATLAB Runtime 安装文件夹的路径。matlabroot通过在系统命令提示符下发出以下
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
运行客户端和服务器
运行客户端和服务器如下:
打开两个命令行窗口 - 一个用于服务器,一个用于客户端。
在每个窗口中,分别导航到包含
DataTypesServer.java或DataTypesClient.java文件夹。通过在系统命令提示符下以一行形式发出以下
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
在第二个命令行窗口中,通过在一行中发出以下
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
