服务端

public interface HelloService {
String sayHello(String msg);
}
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String msg) {
return "hello, " + msg;
}
}
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class RpcServer {
private final ExecutorService executorService = Executors.newCachedThreadPool();
public void publisher(Object service, int port){
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
while (true){
Socket socket = serverSocket.accept();
executorService.execute(new ProcessorHandler(socket, service));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(serverSocket != null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
import com.company.rq.RpcRequest;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.Socket;
public class ProcessorHandler implements Runnable {
private Socket socket;
private Object service;
public ProcessorHandler(Socket socket, Object service) {
this.socket = socket;
this.service = service;
}
@Override
public void run() {
try(ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream())) {
RpcRequest rpcRequest = (RpcRequest) objectInputStream.readObject();
Object result = invoke(rpcRequest);
objectOutputStream.writeObject(result);
objectOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
private Object invoke(RpcRequest rpcRequest) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
Object[] parameters = rpcRequest.getParameters();
Class<?>[] types = new Class[parameters.length];
for(int i = 0; i< parameters.length; i++){
types[i] = parameters[i].getClass();
}
Method method = service.getClass().getMethod(rpcRequest.getMethodName(), types);
return method.invoke(service, parameters);
}
}
import java.io.Serializable;
public class RpcRequest implements Serializable {
private static final long serialVersionUID = 5741151816274588893L;
private String className;
private String methodName;
private Object[] parameters;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public Object[] getParameters() {
return parameters;
}
public void setParameters(Object[] parameters) {
this.parameters = parameters;
}
}
客户端

import java.lang.reflect.Proxy;
public class RpcClientProxy {
public <T> T clientProxy(Class<T> service, String host, int port) {
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class[]{service}, new RemoteInvocationHandler(host, port));
}
}
import com.company.handle.TCPTransport;
import com.company.request.RpcRequest;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class RemoteInvocationHandler implements InvocationHandler {
private String host;
private int port;
public RemoteInvocationHandler(String host, int port) {
this.host = host;
this.port = port;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
RpcRequest rpcRequest = new RpcRequest();
rpcRequest.setClassName(method.getDeclaringClass().getName());
rpcRequest.setMethodName(method.getName());
rpcRequest.setParameters(args);
TCPTransport tcpTransport = new TCPTransport(this.host, this.port);
return tcpTransport.send(rpcRequest);
}
}
import java.io.Serializable;
public class RpcRequest implements Serializable {
private static final long serialVersionUID = 5741151816274588893L;
private String className;
private String methodName;
private Object[] parameters;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public Object[] getParameters() {
return parameters;
}
public void setParameters(Object[] parameters) {
this.parameters = parameters;
}
}
import com.company.request.RpcRequest;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
public class TCPTransport {
private String host;
private int port;
public TCPTransport(String host, int port) {
this.host = host;
this.port = port;
}
private Socket newSocket() {
Socket socket;
try {
socket = new Socket(host, port);
} catch (IOException e) {
throw new RuntimeException("连接建立失败");
}
return socket;
}
public Object send(RpcRequest rpcRequest) {
Socket socket = newSocket();
ObjectOutputStream objectOutputStream = null;
ObjectInputStream objectInputStream = null;
try {
objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
objectOutputStream.writeObject(rpcRequest);
objectOutputStream.flush();
objectInputStream = new ObjectInputStream(socket.getInputStream());
return objectInputStream.readObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("交互数据失败");
} finally {
if (objectInputStream != null) {
try {
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (objectOutputStream != null) {
try {
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}