`
h140465
  • 浏览: 21830 次
  • 性别: 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();
		}
	}
}

 

 

分享到:
评论

相关推荐

    基于java的进程间异步通信系统的设计与实现

    但是,通过一些间接手段,如套接字(Sockets)、远程方法调用(RMI,Remote Method Invocation)和Java的命名与目录接口(JNDI,Java Naming and Directory Interface)等,我们可以实现Java进程间的通信。...

    Java如何实现简单的RPC框架

    Java实现简单的RPC框架 Java如何实现简单的RPC框架是一个非常重要的话题, RPC全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。它允许像调用本地服务一样调用远程服务。它可以有不同的实现...

    安卓Android源码——aidl跨进程调用.zip

    AIDL(Android Interface Definition Language)是Android提供的一种强大的工具,它使得开发者能够轻松地实现进程间的接口调用,类似于Java中的RMI(Remote Method Invocation)。本资料主要探讨了如何使用AIDL在...

    使用AIDL完成进程间的简单通信

    在Android系统中,进程间通信(Inter-Process Communication, 简称IPC)是一种重要的技术,使得不同进程之间可以共享数据或服务。AIDL(Android Interface Definition Language)是Android为实现进程间通信提供的一...

    java系统间通信(分布式调用)

    在IT行业中,尤其是在Java开发领域,系统间通信(IPC,Inter-Process Communication)和分布式调用是构建大型、可扩展的系统的关键技术。本篇主要探讨的是如何在Java环境中实现跨进程的通信以及进行分布式服务的调用...

    perating.rar_Java编程_Java_

    Java编程_Java_"可能是因为标题被截断了,根据描述,我们可以推断这可能是一个关于“Java编程”和“Java”的主题,特别是涉及到“操作系统IPC(Inter-Process Communication,进程间通信)机制”的设计与实现。...

    华南理工大学分布式计算期末考试卷题整理.pdf

    分布式计算和并行计算是两种不同的计算方式。...并发服务器可以同时处理多个请求,常通过线程或异步IPC实现,而迭代服务器每次只处理一个请求,直到该请求完成才接受新的请求,通常不适用于高并发的场景。

    学习hadoop_源代码,RPC_部分

    下面通过一个简单的示例来说明 IPC 的使用方法: ```java public void testCalls() throws Exception { // 创建 server Server server = RPC.getServer(new TestImpl(), ADDRESS, 0, conf); TestProtocol proxy ...

    PB程序AB调用

    在IT行业中,"PB程序AB调用"通常指的是在编程中一个程序(A)如何与另一个程序(B)进行交互,以实现特定的功能或数据共享。这种交互方式是跨进程通信(Inter-Process Communication, IPC)的一种具体实现,特别是在...

    xamarin学习笔记A19(安卓AIDL)

    在处理Android应用时,开发者可能需要实现进程间的通信(IPC),这时就涉及到了AIDL(Android Interface Definition Language)。 AIDL是Android系统提供的一个工具,用于定义服务与不同进程之间交互的接口。它类似...

    大数据课程体系.docx

    - **Zookeeper RMI高可用分布式集群开发**:指导如何使用Zookeeper实现RMI服务的高可用性。 - **Zookeeper Redis高可用监控实现**:说明如何利用Zookeeper实现Redis集群的高可用监控。 #### 九、Netty异步IO通信...

    分布式实验

    ### 分布式实验:基于Java的远程调用与.NET Remoting技术详解 #### 一、分布式实验概述 在现代软件开发领域,随着互联网技术的发展和业务需求的不断扩展,分布式系统已经成为解决高并发、高性能问题的重要手段之一...

    java写的进程通信源码

    本资源包含的是Java实现的进程通信源码,这对于理解和学习Java并发编程、进程间通信(IPC,Inter-Process Communication)具有很高的价值。 Java中的进程通信主要可以通过以下几种方式实现: 1. **管道(Pipes)**...

    java序列化

    3. **进程间通信(IPC)**:在Java的RMI(Remote Method Invocation)中,序列化用于在不同Java虚拟机之间传递对象。 在Java中,我们可以使用`java.io.ObjectOutputStream`来实现对象的序列化,`java.io....

Global site tag (gtag.js) - Google Analytics