`
anysky131
  • 浏览: 171955 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Dualrpc学习笔记 一

    博客分类:
  • GUI
阅读更多
关于dualrp的介绍,这里得写上:
引用open-open上的一段话:
DualRpc是一个用于开发在客户端与服务器之间实现RPC调用的简洁Java框架。它对于构建胖/瘦客户端与服务器上的商业逻辑交互是一个实用的解决方案。这个框架是双向的-客户端可以调用服务端的方法并且服务器同样可以调用客户端的方法。RPC调用或信息都可以被广播到所有连接着的客户端。由于在客户端与服务器之间始终建立着一个单一,持续的TCP/IP连接,所以对话状态在RPC调用期间将被一直保持着。内置SSL,SSH和HTTP/SOCKS 代理通道使得可在防火墙之内部署应用程序并保证调用的安全。DualRpc能够与Swing,SWT和其它GUI框架结合使用。DualRpc 客户端可以通过手动安装也可利用Java Web Start实现大范围部署。
http://www.open-open.com/open149736.htm
对于C/S开发很有用的一个组件。学习一下。
Dualrpc控件学习笔记:
一、类的学习:
   1、客户端:(com.retrogui.dualrpc.client)
DualRpcClient  构造器DualRpcClient(String host,int port),初使化一个连接器。
AbstractClientRpcHandler 用于对DualRpcClient进行注册,相关于一个监听器。DualRpcClient必须注册了它以后才可以连接。

2、服务器端:(com.retrogui.dualrpc.server)
DualRpcServer  构造器DualRpcClient(String host,int port),开启一个服务器。
AbstractServerRpcHandler 用于对DualRpcServer进行注册,相关于一个监听器。DualRpcServer必须注册了它以后才可以连接。
DualRpcServerDispatcher 用于传递信息的一个dispatcher.

二、使用例子:
1、服务器端:
com.anysky.exam.server.Server.java
	private static String host = "localhost";
	private static int ip = 4050;
	String serverHandlerConfigurationObject = "this object represents external data passed to the server handler";
		//开启一个服务器
		DualRpcServer server = new DualRpcServer(host, port, serverHandlerConfigurationObject);
		try {
		//注册服务器的处理器(com.anysky.exam.server.ServerHandler),具体说明见下!
			server.registerServerSideHandlerClassname("com.anysky.exam.server.ServerHandler1");
			//这里可以对其进行注册多个类
			server.registerServerSideHandlerClassname("com.anysky.exam.server.ServerHandler2");
			//开启服务器监听,方法是死循环
			server.listen();
			//下面程序是不会到的了。
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

com.anysky.exam.server.ServerHandler.java

public class ServerHandler extends AbstractServerRpcHandler {
//必须继承此类,并实现此构造器
	public ServerHandler(DualRpcServerDispatcher arg0) {
		super(arg0);
	}
	
	//定义一个可以被客户端访问到的方法
	public Object sendToClient() {
		UserBean userBean = new UserBean();//必须继承了Serializable的类才可以使用
		userBean.setId("12545454");
		userBean.setUsername("ServerToClient");
		userBean.setPassword("ServerToClient");
		return userBean;
	}
	
	//这里可以定义任意可以被客户端访问的方法。
	
	//也可以定义访问客户端的相关handler类中的方法,具体如下:
	public void getClientMethod(){
		String client_handler_class_name="com.anysky.exam.client.ClientHandler";
		//parementer是需要对此方法传递的参数。对象类型。
		Object obj = this.getDispatcher().call(client_handler_class_name,"clientMethodName",paramenter);
		
	}
}



2、客户端:
com.anysky.exam.client.Client.java	
		private static String host = "localhost";
		private static int ip = 4050;
		//创建一个客户端连接
		DualRpcClient client = new DualRpcClient(host, ip);
		//实例化一个客户端Handler
		AbstractClientRpcHandler handler = new ClientHandler();
		//将Handler注册到DualRpcClient中去。没有注册,是不能启动的。具体说明见下!
		client.registerClientSideHandler(handler);
		//开启连接
		client.connect();
		//开启后,程序还可以继续执行
		
		//调用服务器端的方法:
		public UserBean getUserBeanFromServer(){
			String serverHandler="com.anysky.exam.server.ServerHandler";
			//sendToClient就是在ServerHandler类中定义的一个方法名,如果有参数的话,可以在其后添加参数
			//eg:call(serverHandler,"sendToClient",Object obj1,Object obj2);
		 	Object obj = client.call(serverHandler,"sendToClient");
			UserBean userBean = null ;
			if(obj!=null&&(obj instanceof UserBean)){
				userBean = (UserBean)obj;
			}
			return userBean;
		}


com.anysky.exam.client.ClientHandler.java
	public class ClientHandler extends AbstractClientRpcHandler {
	//定义一个可以被服务器访问到的方法
	public UserBean clientMethodName(UserBean userBean){
			if(userBean!=null){
				return userBean;
			}
			return null;
	}
}		



三、常用类,接口介绍
1、com.retrogui.dualrpc.client.IClientCallbackHandler接口
此接口用于在服务器连接时,一方断开,会给另一方一个信息反馈。叫callBack!
使用方法是在ClientHandler中实现它的brokenConnection();方法,然后在DualRpcClient中进行setCallbackHandler()方法注册.就会实时监听服务器的主线程动向。
eg:
Clieng.java
			DualRpcClient client = new DualRpcClient(serverHost, serverPort);

			// Register one or more client side handler objects
			ClientHandler clientSideHandler = new ClientHandler();
			client.registerClientSideHandler(clientSideHandler);

			//注册CallBack,
			client.setCallbackHandler(clientSideHandler);

			// Connect to the server.
			client.connect();

			//获取CliengHandler被同步的一个对象
			Object exitMonitor = clientSideHandler.getExitMonitor();
			//加同步锁,等待被clientHandler中的terminateClient()方法唤醒
			synchronized (exitMonitor) {

				// wait until notified by callback handler
				exitMonitor.wait();

			}


CliengHandler.java 
			public Object exitMonitor = new Object();

			/**
			 * notify() the wait() object ,so the client will be closed!;
			 */
			public void terminateClient() {
				// release the lock on the client
				synchronized (exitMonitor) {
					exitMonitor.notify();
				}
			}
			//服务器一关闭,就会自动通知此方法执行
			public void brokenConnection() {
				this.terminateClient();
			}
			// getter for the exit monitor
			public Object getExitMonitor() {
				return exitMonitor;
			}


2、com.retrogui.dualrpc.server.IServerCallbackHandler接口
此接口是针对上一接口的对应应用,客户端添加了CallBack()监听,服务器端也要添加监听。
一样是需要在ServerHandler中进行接口实现。实现它的brokenConnection()方法
server端注册callBack()时,是在ServerHandler中注册的:
eg:
public class ServerHandler extends AbstractServerRpcHandler implements
		IServerCallbackHandler {
		public ServerHandler(DualRpcServerDispatcher dispatcher) {
		super(dispatcher);
		dispatcher.setCallbackHandler(this);
		}
		public void brokenConnection() {
		serverApplicationThread.setStop(true);
			}
		}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics