RMI的实现
1.编写一个远程接口
/** * 远程接口 */ public interface TestInterfactRemote extends Remote{ public String add(String a,String b) throws RemoteException; public String add() throws RemoteException; }
2.编写接口的实现类
public class TestInterfaceRemoteImpl extends UnicastRemoteObject implements TestInterfactRemote { public TestInterfaceRemoteImpl() throws RemoteException { super(); } public String add(String a, String b) throws RemoteException { return a + b; } public String add() throws RemoteException { return "Hello Word"; } }
3.编写服务端程序
/** * 服务器端 */ public class Server{ public Server() { try { TestInterfactRemote testInterfactRemote = new TestInterfaceRemoteImpl(); LocateRegistry.createRegistry(8800); Naming.rebind("rmi://127.0.0.1:8800/server", testInterfactRemote); System.out.println("Service Start!"); } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]) { new Server(); } }
4.编写客户端程序
/** * 客户端程序 */ public class Client { public static void main(String args[]) { try { TestInterfactRemote testInterfactRemote = (TestInterfactRemote) Naming .lookup("rmi://127.0.0.1:8800/server"); System.out.println(testInterfactRemote.add("rmi a ", "rmib")); } catch (Exception e) { e.printStackTrace(); } } }
IPC的实现过程与RMI很类似
1、编写远程接口
public class IPCFileStatus implements Writable { private String filename; private long time; public IPCFileStatus() { } public IPCFileStatus(String filename) { this.filename=filename; this.time=(new Date()).getTime(); } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } public long getTime() { return time; } public void setTime(long time) { this.time = time; } public String toString() { return "File: "+filename+" Create at "+(new Date(time)); } @Override public void readFields(DataInput in) throws IOException { this.filename = Text.readString(in); this.time = in.readLong(); } @Override public void write(DataOutput out) throws IOException { Text.writeString(out, filename); out.writeLong(time); } }
import org.apache.hadoop.ipc.VersionedProtocol; public interface IPCQueryStatus extends VersionedProtocol{ public static final long versionID = 1L; public IPCFileStatus getFileStatus(String fileName); }
2、编写接口的实现类
public class IPCQueryStatusImpl implements IPCQueryStatus { public IPCQueryStatusImpl() {} @Override public IPCFileStatus getFileStatus(String filename) { IPCFileStatus status=new IPCFileStatus(filename); System.out.println("Method getFileStatus Called, return: "+status); return status; } /** * 用于服务器与客户端,进行IPC接口版本检查,再服务器返回给客户端时调用,如果服务器端的IPC版本与客户端不一致 * 那么就会抛出版本不一致的异常 */ @Override public long getProtocolVersion(String protocol, long clientVersion) throws IOException { System.out.println("protocol: "+protocol); System.out.println("clientVersion: "+clientVersion); return IPCQueryStatus.versionID; } @Override public ProtocolSignature getProtocolSignature(String arg0, long arg1, int arg2) throws IOException { return new ProtocolSignature(IPCQueryStatus.versionID, null); } }
3、编写服务端程序
public class IPCQueryServer { public static final int IPC_PORT = 32121; public static final long IPC_VER = 5473L; public static void main(String[] args) { try { Configuration conf = new Configuration(); // IPCQueryStatusImpl queryService=new IPCQueryStatusImpl(); System.out.println(conf); Server server = new RPC.Builder(conf).setProtocol(IPCQueryStatus.class) .setInstance(new IPCQueryStatusImpl()).setBindAddress("127.0.0.1").setPort(7777) .setNumHandlers(5).setVerbose(true).build(); server.start(); System.out.println("Server ready, press any key to stop"); System.in.read(); server.stop(); System.out.println("Server stopped"); } catch (Exception e) { e.printStackTrace(); } } }
4、编写客户端程序
public class IPCQueryClient { public static void main(String[] args) { try { System.out.println("Interface name: "+IPCQueryStatus.class.getName()); System.out.println("Interface name: "+IPCQueryStatus.class.getMethod("getFileStatus", String.class).getName()); InetSocketAddress addr=new InetSocketAddress("localhost", 7777); IPCQueryStatus query = null; // RPC.getProxy(IPCQueryStatus.class, clientVersion, addr, conf) query = RPC.getProxy(IPCQueryStatus.class, IPCQueryServer.IPC_VER, addr,new Configuration()); IPCFileStatus status=query.getFileStatus("/tmp/testIPC"); System.out.println(status); RPC.stopProxy(query); } catch (Exception e) { e.printStackTrace(); } } }