`
dengyll
  • 浏览: 93401 次
社区版块
存档分类
最新评论

RMI学习笔记-创建第一个RMI应用

阅读更多

 学习使用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,但是需要告诉服务器一声,不然服务器不会得到通知,拒绝连接  

 

1
4
分享到:
评论

相关推荐

    jdk6.0学习笔记

    - **编写第一个 Java 程序**:使用简单的 Hello World 示例来熟悉 Java 的编译和运行流程。 - **选择开发工具**:根据个人喜好选择合适的集成开发环境 (IDE),如 Eclipse、IntelliJ IDEA 等。 以上是对 JDK 6.0 ...

    ejb 学习笔记6

    ### EJB学习笔记第六部分详解 #### 一、EJB之间的调用 EJB (Enterprise JavaBeans) 是Java EE平台中用于开发分布式企业应用程序的重要组件。在实际开发过程中,经常需要一个EJB调用另一个EJB来实现更复杂的业务...

    JAVA学习笔记(林信良 编著 教程)

    - 学习 Java 语法是入门的第一步,包括变量、数据类型、控制结构等基础知识。 2. **API 使用:** - 熟悉 Java SE 中的核心 API,如字符串处理、异常处理、容器、I/O 和线程等。 - 参考官方文档和其他资源加深...

    《Java JDK6学习笔记》(中文ppt->pdf)

    - **编写第一个程序**:使用文本编辑器编写简单的 Java 程序,并使用命令行工具进行编译和运行。 - **选择开发工具**:根据个人喜好和项目需求选择合适的集成开发环境 (IDE),如 Eclipse、IntelliJ IDEA 或 NetBeans...

    匡彬JAVA学习笔记java语言

    1. **第一个程序**: ```java public class Hello { public static void main(String[] args) { System.out.println("Hello World!"); } } ``` - **解析**: - `public`: 表示该类可以被其他类访问。 - `...

    递归调用学习笔记

    在编程领域,递归是一种强大的概念,它是指一个函数或过程在其定义中调用自身的行为。递归在解决复杂问题时特别有用,因为它允许我们用更简洁的方式表达问题的解决方案。这里我们将深入探讨两个经典的递归示例:计算...

    javase部分 重点知识笔记

    - Java起源于SUN Microsystems,由詹姆斯·高斯林创立,1996年发布了第一个商用版本JDK 1.0。自那时以来,Java不断演化,目前最新的稳定版本是Java 17,而学习时参考的是Java 8。 2. **Java语言的特点** - **...

    新手学习java过程笔记

    首先,我们从第一个Java程序开始,`HelloWorld`程序展示了Java的基本语法结构。`public class HelloWorld`定义了一个公共类,这是Java程序的入口。`public static void main(String[] args)`是Java程序的主方法,它...

    java课堂笔记_自己总结的

    #### 第一章 SQL Server 基本操作 ##### SQL Server 操作须知 1. **安装路径**: 安装文件及其安装路径都不能包含中文字符,否则可能会导致安装失败或出现其他错误。 2. **版本有效期**: 如果安装后一段时间内能够...

    javase基础毕向东老师全程笔记

    - 遵循驼峰命名法(camel case):多个单词组成时,第一个单词首字母小写,后续单词首字母大写。 #### 二、数组 - 数组是固定大小的数据结构,用于存储相同类型的数据元素。 - 可以通过索引来访问数组中的元素。 -...

    中间件技术及应用考试复习重点

    #### 第一章 中间件产生背景与分布式环境 ##### 一、中间件的基本概念 1. **中间件定义**:中间件是位于系统软件(如操作系统和网络软件)与应用软件之间的一种软件层。它的主要功能是使不同的应用软件能够跨越...

    第一周期(2021_07_10-2021_07_19).pdf

    【标题】:“第一周期(2021_07_10-2021_07_19).pdf”通常代表着一个学习或工作计划的文档,涵盖了一段时间内的学习内容,例如从2021年7月10日到2021年7月19日的学习笔记或项目进展。 【描述】:“第一周期(2021_07_...

    j2ee 学 习 笔 记

    ### J2EE学习笔记 #### 一、J2EE简介及目标 J2EE(Java 2 Platform, Enterprise Edition)是Sun Microsystems公司推出的一种企业级应用程序开发平台标准,旨在为复杂的分布式企业级应用提供一个完整的解决方案。...

    Useful Documentation for preparing SCEA

    - DMZ是企业网络中一个特殊的区域,用于放置公共服务器等资源,因此了解其安全性至关重要。 11. **获取Sun课程笔记副本** - 尝试获得Sun官方培训课程的笔记副本,这些资料通常包含了大量有价值的实践案例和指导...

    java基础知识第2节

    每种类型占据的字节数不同,例如,char在Java中占据2个字节,而在C语言中是1个字节。 接着,变量是存储数据的容器,声明变量时需要指定其类型和名称,可以带有修饰符(如public、private等)。变量的值在程序执行...

Global site tag (gtag.js) - Google Analytics