注册
就是Server要声明支持那些RPC方法,比如我们之前Server支持‘sayHello’和‘add’方法,其它的方法就无法识别。
我们是之前把注册功能写在了procRequest函数中,但是这样写的话,我么每次新增一个rpc方法的时候就需要修改这个函数,如何避免?引入服务注册机制。
String procRequest(String reqStr)
{
//return "Hello World";
mRequest req =decode(reqStr);
mResponse rsp = new mResponse();
rsp.id = req.id;
if(req.command.equals("sayHello"))
{
rsp.result = "Hello";
}else if(req.command.equals("add"))
{
rsp.result = Integer.toString(req.arg1+req.arg2);
}
else
{
System.out.println("req command"+req.command);
rsp.result = "unknown command";
}
return encode(rsp);
}
服务注册机制,就是将command与具体的function object绑定起来,生成第一dict。
{‘sayHello’:sayHello,'add':add}
有了dict,每次收到req,只要提取出command字段,就可以从dict中找出对应的function,调用该function即可。
Java代码实现:
Client.java不变
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
mClient client = new mClient();
client.setReqId(1);
client.setReqCommand("sayHello");
String reqStr = client.req.getRequest();
try {
Socket socket = new Socket("localhost",12345);
PrintWriter out = new PrintWriter(socket.getOutputStream());
//将reqStr传给server
out.println(reqStr);
out.flush();