94 lines
2.5 KiB
Java
94 lines
2.5 KiB
Java
package org.hwo.rpc.simple;
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.DataInputStream;
|
|
import java.io.DataOutputStream;
|
|
import java.io.ObjectInputStream;
|
|
import java.io.ObjectOutputStream;
|
|
import java.lang.reflect.InvocationHandler;
|
|
import java.lang.reflect.Method;
|
|
import java.lang.reflect.Proxy;
|
|
import java.net.InetAddress;
|
|
import java.net.Socket;
|
|
|
|
public class SimpleRPCService {
|
|
|
|
private class InvocationHelper implements InvocationHandler {
|
|
|
|
private String interfaceName;
|
|
|
|
public InvocationHelper(String interfaceName){
|
|
this.interfaceName = interfaceName;
|
|
}
|
|
|
|
@Override
|
|
public Object invoke(Object proxy, Method method, Object[] args)
|
|
throws Throwable {
|
|
|
|
SimpleRPCRequest simpleRequest = new SimpleRPCRequest(interfaceName, method.getName(), args);
|
|
|
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
|
ObjectOutputStream oos = new ObjectOutputStream(bos);
|
|
|
|
oos.writeObject(simpleRequest);
|
|
oos.flush();
|
|
oos.close();
|
|
bos.close();
|
|
|
|
byte[] request = bos.toByteArray();
|
|
|
|
Socket socket = new Socket(inetAddress,port);
|
|
socket.setSoTimeout(soTimeout);
|
|
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
|
|
dos.writeInt(request.length);
|
|
dos.write(request);
|
|
dos.flush();
|
|
|
|
DataInputStream dis = new DataInputStream(socket.getInputStream());
|
|
int len = dis.readInt();
|
|
byte[] response = new byte[ len ];
|
|
dis.read(response);
|
|
dis.close();
|
|
dos.close();
|
|
socket.close();
|
|
|
|
ByteArrayInputStream bis = new ByteArrayInputStream(response);
|
|
ObjectInputStream ois = new ObjectInputStream(bis);
|
|
|
|
SimpleRPCResponse simpleResponse = (SimpleRPCResponse)ois.readObject();
|
|
|
|
if (simpleResponse.getException() != null)
|
|
throw simpleResponse.getException();
|
|
|
|
return simpleResponse.getResult();
|
|
}
|
|
}
|
|
|
|
private InetAddress inetAddress;
|
|
private int port;
|
|
private int soTimeout;
|
|
|
|
public SimpleRPCService(InetAddress inetAddress,int port){
|
|
this.inetAddress = inetAddress;
|
|
this.port = port;
|
|
this.soTimeout = 30000;
|
|
}
|
|
|
|
public int getSoTimeout() {
|
|
return soTimeout;
|
|
}
|
|
public void setSoTimeout(int soTimeout) {
|
|
this.soTimeout = soTimeout;
|
|
}
|
|
|
|
public <T> T createProxy(Class<T> iface){
|
|
T proxy = (T) Proxy.newProxyInstance(iface.getClassLoader(), new Class[]{ iface }, new InvocationHelper(iface.getCanonicalName()));
|
|
System.err.println("SimpleRPCService: Created Proxy for Interface: " + iface.getCanonicalName() + " at IP: " + inetAddress.toString());
|
|
return proxy;
|
|
}
|
|
|
|
|
|
|
|
}
|