本篇主要完成客户端与服务器通信,请求发送,响应处理。当客户端调用的方法,被连接后,就体处理由该类完成。
1.服务请求
public Object inovker(Method method, Object[] args) {
try {
socket = new Socket(ip,port);
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
int hashCode = method.toString().hashCode();
ArgumentMaker argumentMaker = new ArgumentMaker();
if (args != null) {
for (int i = 0; i < args.length; i++) {
argumentMaker.addArgument("arg" + i, args[i]);
}
}
outputStream.writeUTF(hashCode + "&&" + argumentMaker.toString());
return getResponse(method,dataInputStream);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
拦截到方法和参数,这里首先根据套接字,建立输入输出流,然后准备请求方法和请求参数。请求方法采用hashcode ,为了提高服务端解析效率。请求参数序列化,argumentMaker 封装了JSON工具。当准备完后,将其发送给服务端。
3.响应侦听
private Object getResponse(Method method, DataInputStream dataInputStream) {
try {
String res = dataInputStream.readUTF();
if (res.contains("ERROR")) {
throw new RuntimeException(method + " 执行异常");
}
return ArgumentMaker.fromJson(res, method.getGenericReturnType());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
发送完请求后,立即侦听远端响应。响应首先判断是否执行异常,若异常,则抛异常,否则根据方法返回类型,解析参数。