从零RPC(一)、RMI使用

一、RMI service

package com.back.service;

import java.rmi.Remote;
import java.rmi.RemoteException;
/**
 * RMI:基于BIO的Java远程方法调用。
 * 序列化:java原生。既对象流
 * 接口必须实现Rmote 方法必须抛RemoteException 异常
 * @author back 
 *
 */
public interface HelloService extends Remote{

    
    public String sayHello(String message) throws RemoteException;
}

 

二、服务实现类

package com.back.service;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
 * 实现类 必须继承 UnicastRemoteObject
 * @author back
 *
 */
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService {

    
    public HelloServiceImpl() throws RemoteException {
        super();
    }

    private static final long serialVersionUID = 1L;

    public String sayHello(String message) throws RemoteException {
        return "req : "+message+" . resp :" +"hi";
    }

}


三、自定义通讯工厂类

package com.back.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.server.RMISocketFactory;
/**
  *
  * <p>Title: 指定端口 防止防火墙拦截</p>  
  * <p>Description: </p>  
  * @author back  
  * @date 2019年8月8日
 */
public class CustomerSocketFactory extends RMISocketFactory{

    @Override
    public ServerSocket createServerSocket(int port) throws IOException {
        if(port == 0) port = 8080;
        System.out.println("RMI server socket port : " + port);
        return new ServerSocket(port);
    }

    @Override
    public Socket createSocket(String host, int port) throws IOException {
        return new Socket(host,port);
    }

}


四、Server段类

package com.back.server;

import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.RMISocketFactory;

import com.back.service.HelloService;
import com.back.service.HelloServiceImpl;

/**
  *
  * <p>Title: RmiServer 为了防止随机通讯端口而被防火墙拦截 
  * 固定端口</p>  
  * <p>Description: </p>  
  * @author back  
  * @date 2019年8月8日
  */
public class RmiServer {

    public static void main(String[] args) throws AlreadyBoundException, IOException {
        
        //注册服务、绑定端口
        LocateRegistry.createRegistry(8002);
        
        RMISocketFactory.setSocketFactory(new CustomerSocketFactory());
        
        HelloService service  = new HelloServiceImpl();
        //访问Url定义
        Naming.bind("rmi://localhost:8002/helloService", service);
        
        System.out.println("export HelloService Success ! server start !");
    }
}

 

五、客户端类

package com.back.client;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import com.back.service.HelloService;

/**
  *
  * <p>Title: RmiClient</p>  
  * <p>Description: </p>  
  * @author back  
  * @date 2019年8月8日
 */
public class RmiClient {

    public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException {
        //服务引入
        HelloService service = (HelloService)Naming.lookup("rmi://localhost:8002/helloService");
    
        System.out.println(service.sayHello("client"));
    }
}


 

6、项目中使用的自定义注解配置

此模块可以参考前面的手动实现IOC来完成。

这里给出一个 我使用反射+注解简化的Motan的配置链接。提供参考

https://github.com/back-zhao/study-rpc

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值