4
回答
谁愿意帮忙写一个javaRMI回调的例子吗,越简单越好,参杂了其它怕看不懂,初学

<无详细内容>

举报
vaja8520
发帖于2年前 4回/400阅
共有4个答案 最后回答: 2年前

不知道这样是不是满足你的需求:

server 代码

package test.server;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class ServerRMI {
	
	
	
	public static void main(String[] args) {
		
		try {
			ITestServer server = new ServerTestImpl();
			LocateRegistry.createRegistry(9999);
			String serverRmiUrl = "rmi://127.0.0.1:9999/server";
			Naming.bind(serverRmiUrl, server);
		} catch (Exception e) {
			e.printStackTrace();
		}	
		
	}
	
	
}



package test.server;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ITestServer  extends Remote{
	

	public void doSomeThingLong(String arg1   ) throws RemoteException;
	
	public void registerClientCallBack( String clientURL ) throws RemoteException;
}



package test.server;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;

import test.client.ITestClient;

public class ServerTestImpl extends UnicastRemoteObject implements ITestServer {


	public ServerTestImpl() throws RemoteException {
		super();
	}
	

	@Override
	public void doSomeThingLong(final String arg1) throws RemoteException {
		
		new Thread(){
			public void run() {
				System.out.println(  "This is  doSomeThingLong  " + arg1 +  new Date());
				
				try {
					Thread.sleep(5000);
					clientCallBack.callBack1();
				} catch (Exception e) {
					e.printStackTrace();
				}
			};
		}.start();
		
	}


	
	private ITestClient clientCallBack = null;
	
	@Override
	public void registerClientCallBack(String clientURL) throws RemoteException {
		try {
			clientCallBack =  (ITestClient) Naming.lookup(clientURL);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}



client 端 
package test.client;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

import test.server.ITestServer;
import test.server.ServerTestImpl;

public class ClientRMI {
	
	
	public static void main(String[] args) {
		
		
		try {
			String serverRmiUrl = "rmi://127.0.0.1:9999/server";
			ITestServer server =  (ITestServer) Naming.lookup(serverRmiUrl);
			
			ITestClient client = new TestClientImpl();
			LocateRegistry.createRegistry(9998);
			String clientRmiUrl = "rmi://127.0.0.1:9998/client";
			Naming.bind(clientRmiUrl, client);
			server.registerClientCallBack(clientRmiUrl);
			
			server.doSomeThingLong("ARG1");
			System.out.println("调用server 端方法, 开始等待回调." );
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}
	
}



package test.client;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ITestClient extends Remote{

	
	public void callBack1() throws RemoteException;
	
}



package test.client;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;


public class TestClientImpl extends UnicastRemoteObject implements ITestClient {

	public TestClientImpl() throws RemoteException {
		super();
	}

	@Override
	public void callBack1() throws RemoteException {
		System.out.println(  "This is Client callback ..."  + new Date());
	}
	
}



先启动 serverRMI 这个类 再启动clientRMI这个类
--- 共有 6 条评论 ---
嗯哼_回复 @vaja8520 : RMI 本质上就是 TCP socket 通信 客户端一直持有一个 服务端RMI对象是不会占用过多资源的。所以只需要在初始的时候 建立好连接即可。 2年前 回复
vaja8520回复 @嗯哼_ : 代码不会写 2年前 回复
vaja8520回复 @嗯哼_ : 你要访问服务器的对象,前提是服务器是开启的,对象是已经注册的。但是你不知道客户端什么时候要调用对象,所以你的对象要一直处在激活状态,在对象有很多的时候就会浪费很多的资源。于是就引入了这个远程激活,当客户端要调用的时候才去注册。于是客户端在调用对象之前,要先把对象激活。 2年前 回复
嗯哼_回复 @vaja8520 : 没明白 远程对象激活是什么意思。 2年前 回复
vaja8520我想麻烦你再帮忙写一个java RMI远程对象激活的例子,可以吗?如果不方便也没事。 2年前 回复
顶部