`
h140465
  • 浏览: 20784 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

RMI与IPC的简单实现

 
阅读更多

     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();
		}
	}
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics