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

vaja8520 发布于 2016/06/19 22:35
阅读 401
收藏 0

<无详细内容>

加载中
0
嗯哼_
嗯哼_

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

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这个类
嗯哼_
嗯哼_
回复 @vaja8520 : RMI 本质上就是 TCP socket 通信 客户端一直持有一个 服务端RMI对象是不会占用过多资源的。所以只需要在初始的时候 建立好连接即可。
v
vaja8520
回复 @嗯哼_ : 代码不会写
v
vaja8520
回复 @嗯哼_ : 你要访问服务器的对象,前提是服务器是开启的,对象是已经注册的。但是你不知道客户端什么时候要调用对象,所以你的对象要一直处在激活状态,在对象有很多的时候就会浪费很多的资源。于是就引入了这个远程激活,当客户端要调用的时候才去注册。于是客户端在调用对象之前,要先把对象激活。
嗯哼_
嗯哼_
回复 @vaja8520 : 没明白 远程对象激活是什么意思。
v
vaja8520
我想麻烦你再帮忙写一个java RMI远程对象激活的例子,可以吗?如果不方便也没事。
下一页
0
v
vaja8520
可以帮忙写一个吗,网上找到不这个例子,好不容易找到一个,它参杂其它功能的,我看不明白
0
dy810810
dy810810
现在java都不学ejb了吗?这才是j2ee呢
v
vaja8520
也有学,但是现在在想明白RMI这个,你可以帮忙写个例子吗
0
追梦的青春
建议楼主可以搜索下jndl和ejb相关的文章。
返回顶部
顶部