一、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