java-org.hwo/src/org/hwo/rpc/simple/SimpleRPCService.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;
}
}