1. 程式人生 > >Java實現一個簡單的RPC框架(三) 帶引數的本地呼叫

Java實現一個簡單的RPC框架(三) 帶引數的本地呼叫

參考:

上面我們已經實現了通過我們指定的協議呼叫本地的其它類的函式來實現自己的功能,接下來我們要實現帶引數的RPC呼叫。

這裡我以add(a,b)為例子,為了實現這個功能,我們的請求方多了兩個引數a和b,那麼我們的RPC協議就要進行相應的修改:前面我們的請求方包含id和commnad,現在我們再增加兩個引數arg1和arg2

被呼叫方除了處理sayHello命令外,新增處理add命令的功能。

Java程式碼實現:

/**
 * 帶引數的RPC呼叫
 * 新增一個add(a,b)功能
 * @author xchen
 *
 */
public class Test3 {
	public static void main(String[] args) {
		mServer server = new mServer();
		mClient client = new mClient();
		client
		.remote=server;
		System.out.println(client.sayHello());
		System.out.println(client.add(1, 2));
	}
}
class mRequest
{
	int id;
	String command;
	int arg1;
	int arg2;	
}
class mResponse
{
	int id;	
	String result;
}
class mClient
{
	mServer remote;
	mRequest req = new mRequest();
	mResponse rsp = new mResponse();
	
	void setReqId(int id)
	{
		req.id=id;
	}
	void setReqCommand(String command)
	{
		req.command=command;
	}
	mClient()
	{
		remote = null;
	}
	
	String getRsp(mRequest req)
	{
		rsp = remote.procRequest(req);
		return rsp.result;
	}
	String sayHello()
	{
		req.id=1;
		req.command="sayHello";
		return getRsp(req);
	}
	String add(int a,int b)
	{
		req.id=1;
		req.command="add";
		req.arg1=a;
		req.arg2=b;
		return getRsp(req);
	}
}

//
class mServer
{
//	Server解析收到的Request報文(報文由id和command組成)
//	將回復報文id設定為收到的報文一致
//	如果command為sayHello,那麼範圍的報文內容為Hello
//	如果為其他命令,我們暫時沒有設定,所有輸出無法解析提示訊息unknown command
	mResponse procRequest(mRequest req)
	{
		//return "Hello World";
		mResponse rsp = new mResponse();
		rsp.id = req.id;
		if(req.command == "sayHello")
		{
			rsp.result = "Hello";
		}else if(req.command=="add")
		{
			rsp.result = Integer.toString(req.arg1+req.arg2);
		}
		else
		{
			rsp.result = "unknown command";
		}
		return rsp;
	}
}
//沒有實現遠端