• 远程调用之RMI技术


    ---恢复内容开始---

    RMI已经不是什么新的技术了,但是相对于webservice来说,rmi比较简单,比较适合一些小的应用,下面的helloword列子可以介绍rmi的相关技术

    服务器端代码:

      服务器接口实现Remote

     1 package com.qcf.server;
     2 
     3 import java.rmi.Remote;
     4 import java.rmi.RemoteException;
     5 /**
     6  * 服务类
     7  * 定义行为集
     8  * @author Administrator
     9  *
    10  */
    11 public interface IHello extends Remote {
    12 
    13     //在服务器端打印客户端传过来的字符串并返回该字符串
    14     public String sayHello(String str) throws RemoteException;
    15 }

      接口的实现类

     1 package com.qcf.server;
     2 
     3 import java.rmi.RemoteException;
     4 import java.rmi.server.UnicastRemoteObject;
     5 
     6 /**
     7  * 服务器端实现类
     8  * 需要继承UnicastRemoteObject
     9  * @author Administrator
    10  *
    11  */
    12 public class IHelloImpl extends UnicastRemoteObject implements IHello{
    13 
    14     //必须的
    15     protected IHelloImpl() throws RemoteException {
    16         super();
    17     }
    18 
    19     @Override
    20     public String sayHello(String str) throws RemoteException {
    21         System.out.println("客户端传过来的字符串是:" + str);
    22         return str;
    23     }
    24 
    25 }

      服务类启动服务类

     1 package com.qcf.server;
     2 
     3 import java.net.MalformedURLException;
     4 import java.rmi.AlreadyBoundException;
     5 import java.rmi.Naming;
     6 import java.rmi.RemoteException;
     7 import java.rmi.registry.LocateRegistry;
     8 
     9 /**
    10  * RMI服务器
    11  * 1、创建一个服务
    12  * 2、启动服务器
    13  * 3、注册服务
    14  * @author Administrator
    15  *
    16  */
    17 public class HelloServer {
    18 
    19     public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException {
    20         //1、创建一个服务
    21         IHello iHello=new IHelloImpl();
    22         //2、启动服务器 启动一个注册表并把注册表绑定到一个端口(默认端口1099)  
    23         LocateRegistry.createRegistry(8189);
    24         
    25         //3将服务注册到注册表  绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)   
    26         Naming.bind("rmi://localhost:8189/ihello", iHello);
    27         System.out.println("server start success!");
    28     }
    29 }

      客户端类

        创建接口类如上

        客户端测试类

     1 package com.qcf.client;
     2 
     3 import java.net.MalformedURLException;
     4 import java.rmi.Naming;
     5 import java.rmi.NotBoundException;
     6 import java.rmi.RemoteException;
     7 
     8 /**
     9  * 客户端测试类
    10  * 服务器是谁  服务器
    11  * 如何获取服务 查找
    12  * 调用接口
    13  * @author Administrator
    14  *
    15  */
    16 public class HelloClient {
    17     public static void main(String[] args) throws Exception, Exception, Exception {
    18         //查找服务
    19         IHello hello=(IHello) Naming.lookup("rmi://localhost:8489/ihello");
    20         //调用接口
    21         String str=hello.sayHello("哈哈哈 。我测试成功了");
    22         System.out.println("客户端"+str);
    23     }
    24 }
    运行RMI服务端程序:
     
    运行RMI客户端程序:
     
     
    总结:
    从上面的过程来看,RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。
    这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。
    RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。

    ---恢复内容结束---

  • 相关阅读:
    hibernate联合主键 注解方式
    使用Json出现java.lang.NoClassDefFoundError解决方法
    Spring 定时任务2
    Spring 定时任务1
    Javasocket1
    volatile
    Java中byte与16进制字符串的互相转换
    Spring 源码学习
    web服务器工作原理
    SpringMVC国际化
  • 原文地址:https://www.cnblogs.com/quchengfeng/p/4221981.html
Copyright © 2020-2023  润新知