java分布式对象RMI应用测试用例

【0】README

0.1)本文旨在对http://blog.csdn.net/PacosonSWJTU/article/details/50705192  中的代码进行实践(如何部署一个使用RMI框架的程序以进行远程调用);

0.2) for complete source code, please visit  https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapter11/rmi_test

0.3)目录结构如下: 



【1】部署前的准备

step1)创建两个目录, 分别存放用于启动server 和 client 的类:

server/
    WarehouseServer.class
    Warehouse.class
    WarehouseImpl.class
client/
    WarehouseClient.class
    Warehouse.class
step2)创建download 目录,用于存放 NanoHTTPD web server 


【1】部署步骤如下

step1)打开一个新的控制台窗口,转到download目录,然后将NanoHTTPD.java(NanoHTTPD web 服务器)复制到这个目录中。(NanoHTTPD web 服务器的源代码 ,参见, https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapter11/rmi_test)

<span style="font-size:14px;">package com.corejava.chapter11.download;import java.io.IOException;public class NanoHTTPDMain extends NanoHTTPD
{public NanoHTTPDMain() throws IOException{super(8080);start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);  System.out.println("\n nano http web server is running! Point your browers to http://localhost:8080/ \n");  }public static void main(String[] args){try{new NanoHTTPDMain();	} catch (Exception e){e.printStackTrace();}}
}
</span>


step2)在server 程序中通过代码注册通讯端口和注册通讯路径

<span style="font-size:14px;">public class WarehouseServer
{public static void main(String[] args){try{WarehouseImpl warehouseService = new WarehouseImpl();// 注册通讯端口LocateRegistry.createRegistry(1099);// 注册通讯路径Naming.rebind("rmi://localhost:1099/warehouseService", warehouseService);System.out.println("warehouse service starts");} catch (Exception e){e.printStackTrace();}}
}</span>

<span style="font-size:14px;">// 这个WarehouseImpl类是远程方法调用的目标,因为它继承自UnicastRemoteObject,
// 这个类的构造器使得它的对象可供远程访问; 
public class WarehouseImpl extends UnicastRemoteObject implements Warehouse
{private Map<String, Double> prices;public WarehouseImpl() throws RemoteException{prices = new HashMap<>();prices.put("A", 24.95);prices.put("B", 49.95);}public double getPrice(String description) throws RemoteException{Double price = prices.get(description);return price == null ? 0 : price;}
}</span>
<span style="font-size:14px;">// 远程对象的接口必须扩展Remote接口
public interface Warehouse extends Remote
{  double getPrice(String description) throws RemoteException;
}
</span>

step3)现在已经准备好启动服务器了。打开第三个控制台窗口,转到server目录,并执行下面的命令:

java -Djava.rmi.server.codebase=http://localhost:8080/ WarehouseServer  // java.rmi.server.codebase属性指出了服务类文件的URL。服务器程序将这个URL传递给RMI注册表。


step4)最后,打开第四个控制台窗口,转到client目录,运行:

<span style="font-size:14px;">// 客户端如何获得远程仓库对象的存根,并调用远程的getPrice方法。
public class WarehouseClient
{public static void main(String[] args){try{Context namingContext = new InitialContext();// NameClassPair是一个助手类: 它包含绑定对象的名字和该对象所属类的名字。Enumeration<NameClassPair> e = namingContext.list("rmi://localhost:1099/");while (e.hasMoreElements())System.out.println(e.nextElement().getName());// 客户端可以通过下面的方式,来指定服务器和远程对象的名字,以此获得访问远程对象所需的存根:String url = "rmi://localhost:1099/warehouseService";Warehouse centralWarehouse = (Warehouse) namingContext.lookup(url);String descr = "A";double price = centralWarehouse.getPrice(descr);System.out.println(descr + ": " + price);} catch (Exception e){e.printStackTrace();}}}</span>


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

neo4j 迁移_在Kubernetes中迁移Neo4j图模式

neo4j 迁移在零停机时间下运行企业应用程序时&#xff0c;我们需要能够执行数据库架构迁移而又不中断活动用户。 这不仅对于关系数据库很重要&#xff0c;而且对于诸如Neo4J之类的图数据库也很重要&#xff0c;后者不会在write上强制执行架构。 但是&#xff0c;重构图形并使图…

Windows访问Linux的Tomcat,显示无法连接

一、端口占用 先查看tomcat下的logs日志文件&#xff0c;如果现实地址已被占用&#xff0c;则需重新修改端口。 tomcat默认启动的是8080&#xff0c;如果你想修改为80&#xff0c;则需要修改server.xml文件:vim $CATALINA_HOME/conf/server.xml #如果没有配置$CATALINA_HOME&am…

java分布式对象——远程方法中的参数和返回值+远程对象激活

【0】README 1&#xff09;本文文字描述转自 core java volume 2&#xff0c; 旨在学习 java分布式对象——远程方法中的参数和返回值远程对象激活 的相关知识&#xff1b; 【1】远程方法中的参数和返回值 1&#xff09; 在开始进行远程方法调用时&#xff0c;调用参数需要从…

wcf:rest_REST:管理多对多关系

wcf:rest介绍 管理多个资源之间的关系可能是RESTful API的重要组成部分。 在这篇文章中&#xff0c;我们将看到使用REST API可以管理多对多关系。 我们以一个简单的用户 / 组关系为例。 假设用户和组是两个单独的资源&#xff08;例如/ users和/ groups &#xff09;&#xff…

java安全——类加载器+字节码校验+安全管理器与访问权限

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2&#xff0c;旨在学习 java安全 的相关知识&#xff1b; 【1】类加载器 1&#xff09;java 技术提供了以下3种确保安全的机制&#xff08;mechanism&#xff09;&#xff1a; m1&#xff09;语言设计特性&am…

Tomcat的web项目部署方式

一、host配置Context 在tomcat中的conf目录中&#xff0c;在server.xml中的&#xff0c;<host/>节点中添加&#xff1a; <Context path"/app" docBase"D:/myeclipse/firstapp/WebRoot" debug"0" privileged"true" reloadab…

java.rmi.UnmarshalException:errorunmarshalling return; java.lang.ClassNotFoundException的解决方法

1&#xff09;problem 出现 java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException 异常的原因是&#xff0c;在命令行执行 rmiregistry&#xff0c;并没有指定好 绑定时查找的类文件的路径。 …

javafx 图标_JavaFX技巧32:需要图标吗? 使用Ikonli!

javafx 图标动机 自2013年以来&#xff0c;我一直在编写JavaFX应用程序和库的代码&#xff0c;它们的共同点是&#xff0c;我需要找到可以用于它们的良好图标/图形。 作为前Swing开发人员&#xff0c;我首先使用图像文件&#xff0c;GIF或PNG。 通常&#xff0c;我会从IconExpe…

java安全 ——JAAS(Java 认证和授权服务)开发指南

以下内容转自&#xff1a; http://lyb520320.iteye.com/blog/720478【0】README1&#xff09;本文翻译自&#xff1a;http://java.sun.com/developer/technicalArticles/Security/jaasv2/2&#xff09;传统的JAVA安全机制没有提供必要的架构支持传统的认证和授权&#xff1b;在…

aws dynamodb_AWS Lambda将数据保存在DynamoDB中

aws dynamodb在本教程中&#xff0c;我们将看到如何使用AWS Lambda将数据保存在Dynamo DB中。 这是必需的步骤&#xff1a; – 在Dynamo数据库中创建一个名为Employee的表 –创建一个AWS Lambda函数&#xff0c;该函数可以使用Dynamo DB中的Employee POJO保存员工的名字和姓…

Tomcat处理一个HTTP请求的过程

一、Tomcat的组成 &#xff08;1&#xff09;Server服务器元素代表整个catalina servlet容器。是单例模式。 &#xff08;2&#xff09;ServiceService是这样一个集合&#xff1a;它由一个或者多个Connector组成&#xff0c;以及一个Engine&#xff0c;负责处理所有Connector所…

java安全——数字签名+代码签名

【0】README1&#xff09;本文文字描述转自 core java volume 2, 旨在学习 java安全——数字签名 的基础知识&#xff1b;2&#xff09;本文实践内容以及截图笔记均为原创&#xff1b;3&#xff09;如果要给予applet更多的信赖&#xff0c;你必须知道下面两件事&#xff1a; 3.…

//rest风格写_REST /使用提要发布事件

//rest风格写处理事件 当使用多个解耦的服务时&#xff08;例如&#xff0c;在微服务体系结构中 &#xff09;&#xff0c;很有可能需要一种方法来将某种域事件从一个服务发布到一个或多个其他服务。 许多广泛采用的解决方案依赖于单独的基础结构来解决此问题&#xff08;例如…

Java IO总结

一、IO的类型 面向字节的流&#xff0c;面向字符的流二、面向字节的流 &#xff08;1&#xff09;InputStream FileInputStream FilterInputStream -BufferedInputStream -DataInputStream -PushbackInputStream 回退流 unread() ObjectInputStream PipedInputSt…

java安全——加密

【0】README1&#xff09;本文文字描述转自 core java volume 2&#xff0c;旨在学习 java安全——加密 的基础知识&#xff1b;2&#xff09;java 安全性的第二个重要方面是加密。3&#xff09;认证对于代码签名已足够了-没必要将代码隐藏起来。但是&#xff0c;当applet或者应…

java 异常 最佳实践_处理Java异常的10种最佳实践

java 异常 最佳实践在本文中&#xff0c;我们将看到处理Java异常的最佳实践。 用Java处理异常不是一件容易的事&#xff0c;因为新手很难理解&#xff0c;甚至专业的开发人员也可能浪费时间讨论应该抛出或处理哪些Java异常。 因此&#xff0c;最大的开发公司对如何使用它们有一…

Java NIO总结

一、NIO NIO是new IO&#xff0c;也是非阻塞IO。有Channel、Selector、Buffer、Pipe、FileLock等类。 Buffer在java.nio包 Channel、Selector、Pipe、FileLock等在java.nio.channels包 二、Channel通道 设置非阻塞configureBlocking(false); 注册选择器register(selector,…

java 不可变map_如何用Java创建不可变的Map

java 不可变map你好朋友&#xff0c; 在本教程中&#xff0c;我们将看到如何在Java中创建不可变的Map。 –不可变的类或对象是什么意思&#xff1f; –什么是不可变地图&#xff1f; –如何在Java中创建不可变的Map&#xff1f; 不变的类或对象是什么意思&#xff1f; 不可…

ToolProvider.getSystemJavaCompiler() return null 的解决方法

【1】利用java 编译器API 编译 普通的java文件 1.1&#xff09;代码如下&#xff1a; package com.corejava.chapter10_2;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream;import javax.tools.JavaCompiler; import jav…

脚本错误和安全警报怎么解决_适用于应用程序错误的AWS警报

脚本错误和安全警报怎么解决监视对于任何实际应用都是关键的。 您必须知道正在发生的事情&#xff0c;并在发生问题时实时得到警报。 AWS为此提供了CloudWatch&#xff0c;并自动为您提供了许多指标。 但是&#xff0c;您必须定义一些自己的东西。 然后&#xff0c;您需要定义适…