学习使用RMI框架,抄写了一段例子代码:
代码如下:
package com.you.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;
import javax.naming.Context;
import javax.naming.InitialContext;
public class SimpleServer {
public static void main(String[] args) {
try {
HelloService service1 = new HelloServiceImpl("service1");
HelloService service2 = new HelloServiceImpl("service2");
Context namingContext = new InitialContext();
LocateRegistry.createRegistry(1099);
namingContext.rebind("rmi://localhost:1099/HelloService1", service1);//rebind注册对象,把对象与一个名字
namingContext.rebind("rmi://localhost:1099/HelloService2", service2);//绑定,如果改名字已经被绑定,不过抛出异常
System.out.println("服务器注册了两个HelloService对象");
} catch (Exception e) {
e.printStackTrace();
}
}
}
interface HelloService extends Remote{
public String echo(String msg) throws RemoteException;
public Date getTime() throws RemoteException;
}
class HelloServiceImpl extends UnicastRemoteObject implements HelloService{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
public HelloServiceImpl(String name) throws RemoteException{
this.name = name;
}
@Override
public String echo(String msg) {
System.out.println(name + "调用echo()方法");
return "echo:" + msg + "from" + name;
}
@Override
public Date getTime() {
System.out.println(name + "调用getTime()方法");
return new Date();
}
}
package com.you.rmi;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
public class SimpleClient {
public static void showRemoteObjects(Context namingContext) throws Exception {
NamingEnumeration<NameClassPair> e = namingContext.list("rmi:");
while(e.hasMore())
System.out.println(e.next().getName());
}
public static void main(String[] args) {
try {
String url = "rmi://localhost/";
Context namingContext = new InitialContext();
//获得远程对象的存根对象
HelloService service1 = (HelloService) namingContext.lookup(url + "HelloService1");
HelloService service2 = (HelloService) namingContext.lookup(url + "HelloService2");
//测试存根对象所属的类
Class stubClass = service1.getClass();
System.out.println("service1 是" + stubClass.getName() + "的实例");
Class[] interfaces = stubClass.getInterfaces();
for(int i = 0; i < interfaces.length; i++) {
System.out.println("存根类实现了" + interfaces[i].getName());
System.out.println(service1.echo("hello"));
System.out.println(service1.getTime());
System.out.println(service2.echo("hello"));
System.out.println(service2.getTime());
showRemoteObjects(namingContext);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
java进阶网在例子中没有LocateRegistry.createRegistry(1099);这句代码,一开始运行的时候,总是报错,报服务器拒绝连接的错误,加上这句话就运行成功了,虽然rmi的默认端口是1099,但是需要告诉服务器一声,不然服务器不会得到通知,拒绝连接 。
分享到:
相关推荐
- **编写第一个 Java 程序**:使用简单的 Hello World 示例来熟悉 Java 的编译和运行流程。 - **选择开发工具**:根据个人喜好选择合适的集成开发环境 (IDE),如 Eclipse、IntelliJ IDEA 等。 以上是对 JDK 6.0 ...
### EJB学习笔记第六部分详解 #### 一、EJB之间的调用 EJB (Enterprise JavaBeans) 是Java EE平台中用于开发分布式企业应用程序的重要组件。在实际开发过程中,经常需要一个EJB调用另一个EJB来实现更复杂的业务...
- 学习 Java 语法是入门的第一步,包括变量、数据类型、控制结构等基础知识。 2. **API 使用:** - 熟悉 Java SE 中的核心 API,如字符串处理、异常处理、容器、I/O 和线程等。 - 参考官方文档和其他资源加深...
- **编写第一个程序**:使用文本编辑器编写简单的 Java 程序,并使用命令行工具进行编译和运行。 - **选择开发工具**:根据个人喜好和项目需求选择合适的集成开发环境 (IDE),如 Eclipse、IntelliJ IDEA 或 NetBeans...
1. **第一个程序**: ```java public class Hello { public static void main(String[] args) { System.out.println("Hello World!"); } } ``` - **解析**: - `public`: 表示该类可以被其他类访问。 - `...
在编程领域,递归是一种强大的概念,它是指一个函数或过程在其定义中调用自身的行为。递归在解决复杂问题时特别有用,因为它允许我们用更简洁的方式表达问题的解决方案。这里我们将深入探讨两个经典的递归示例:计算...
- Java起源于SUN Microsystems,由詹姆斯·高斯林创立,1996年发布了第一个商用版本JDK 1.0。自那时以来,Java不断演化,目前最新的稳定版本是Java 17,而学习时参考的是Java 8。 2. **Java语言的特点** - **...
首先,我们从第一个Java程序开始,`HelloWorld`程序展示了Java的基本语法结构。`public class HelloWorld`定义了一个公共类,这是Java程序的入口。`public static void main(String[] args)`是Java程序的主方法,它...
#### 第一章 SQL Server 基本操作 ##### SQL Server 操作须知 1. **安装路径**: 安装文件及其安装路径都不能包含中文字符,否则可能会导致安装失败或出现其他错误。 2. **版本有效期**: 如果安装后一段时间内能够...
- 遵循驼峰命名法(camel case):多个单词组成时,第一个单词首字母小写,后续单词首字母大写。 #### 二、数组 - 数组是固定大小的数据结构,用于存储相同类型的数据元素。 - 可以通过索引来访问数组中的元素。 -...
#### 第一章 中间件产生背景与分布式环境 ##### 一、中间件的基本概念 1. **中间件定义**:中间件是位于系统软件(如操作系统和网络软件)与应用软件之间的一种软件层。它的主要功能是使不同的应用软件能够跨越...
【标题】:“第一周期(2021_07_10-2021_07_19).pdf”通常代表着一个学习或工作计划的文档,涵盖了一段时间内的学习内容,例如从2021年7月10日到2021年7月19日的学习笔记或项目进展。 【描述】:“第一周期(2021_07_...
### J2EE学习笔记 #### 一、J2EE简介及目标 J2EE(Java 2 Platform, Enterprise Edition)是Sun Microsystems公司推出的一种企业级应用程序开发平台标准,旨在为复杂的分布式企业级应用提供一个完整的解决方案。...
- DMZ是企业网络中一个特殊的区域,用于放置公共服务器等资源,因此了解其安全性至关重要。 11. **获取Sun课程笔记副本** - 尝试获得Sun官方培训课程的笔记副本,这些资料通常包含了大量有价值的实践案例和指导...
每种类型占据的字节数不同,例如,char在Java中占据2个字节,而在C语言中是1个字节。 接着,变量是存储数据的容器,声明变量时需要指定其类型和名称,可以带有修饰符(如public、private等)。变量的值在程序执行...