package api;
/**
* @Author: Jimmy
* @Date: 2019-10-30 18:06
*/
public interface TimeService {
public long getCurrentTimeMillis() throws Throwable;
public Long getCurrentTimeSec() throws Throwable;
}
服务端timeService的具体实现
package provide;
import api.TimeService;
/**
* @Author: Jimmy
* @Date: 2019-10-30 18:08
*/
public class TimeServiceImpl implements TimeService {
public long getCurrentTimeMillis() {
return System.currentTimeMillis();
}
public Long getCurrentTimeSec() {
return System.currentTimeMillis()/1000;
}
}
服务端通过代理暴露服务(为了简单,这是用静态代理,事实是使用动态代理让使用者不知道这一层的代码)
package provide;
import api.TimeService;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Author: Jimmy
* @Date: 2019-10-30 18:10
*/
public class TimeServiceProvideProxy extends Thread {
//被代理的对象(具体的业务处理实现类)
private TimeService timeService;
public TimeServiceProvideProxy(TimeService timeService) {
// 传入代理对象(具体的业务处理实现类)
this.timeService = timeService;
}
@Override
public void run() {
try {
// 打开服务端Socket
ServerSocket serverSocket = new ServerSocket(9000);
// 接受客户端的请求
Socket socket = serverSocket.accept();
while (socket != null) {
// ObjectInputStream是java 提供的序列化/反序列化的一种工具
ObjectInputStream inStream =
new ObjectInputStream(socket.getInputStream());
String method = (String) inStream.readObject();
//根据客户端传入的请求 找到具体的方法,使用实现类去执行
if (method.equals("getCurrentTimeMillis")) {
long currentTimeMillis = timeService.getCurrentTimeMillis();
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream());
// return result
outStream.writeLong(currentTimeMillis);
outStream.flush();
}
if (method.equals("getCurrentTimeSec")) {
long currentTimeSec = timeService.getCurrentTimeSec();
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream());
// 返回结果 通过 ObjectOutputStream序列化
outStream.writeLong(currentTimeSec);
outStream.flush();
}
}
} catch (Throwable t) {
t.printStackTrace();
}
}
}
客户端发起请求的代理(为了简单,这是用静态代理,事实是使用动态代理让使用者不知道这一层的代码)
package consumer;
import api.TimeService;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
/**
* @Author: Jimmy
* @Date: 2019-10-30 18:14
*/
public class TimeServiceClientProxy implements TimeService {
private Socket socket;
public TimeServiceClientProxy() throws Throwable{
// 客户端的网络链接
socket = new Socket("127.0.0.1", 9000);
}
public long getCurrentTimeMillis() throws Throwable {
// 没有具体的业务,仅仅是封装一个请求及协议(这里的请求很简单就是 一个方法名)
// 服务端拿到这个请求 通过反序列化拿到结果,协议是定义好的就是一个简单的方法名,服务端直接根据方法名去执行具体的方法
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream());
outStream.writeObject("getCurrentTimeMillis");
outStream.flush();
ObjectInputStream inStream =
new ObjectInputStream(socket.getInputStream());
return inStream.readLong();
}
public Long getCurrentTimeSec() throws Throwable {
ObjectOutputStream outStream =
new ObjectOutputStream(socket.getOutputStream());
outStream.writeObject("getCurrentTimeSec");
outStream.flush();
ObjectInputStream inStream =
new ObjectInputStream(socket.getInputStream());
return inStream.readLong();
}