JKASRPC
RPC(Remote
ProcedureCallProtocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务。它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
一、配置
[RPC]
;是否启用RPC
rpc_enable=1
;RPC服务所在包名
rpc_package=test.z.rpc
;RPC端口
rpc_port=
二、服务命名
服务由接口文件和实现文件构成
命名方式为服务名可自行命名,遵循驼峰命名规则
实现名由服务接口名+Impl方式命名
如:
Hello为服务接口名
HelloImpl为服务实现命名
三、案例
1、服务端
packagetest.z.rpc;
publicinterfaceHello{
StringsayHello(Stringstring);
}
packagetest.z.rpc;
publicclassHelloImplimplementsHello{
publicStringsayHello(Stringstring){
//TODOAuto-generatedmethodstub
return"你好:"+string;
}
}
2、客户端(只支持JAVA)
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.Method;
importjava.lang.reflect.Proxy;
importjava.net.InetSocketAddress;
importjava.net.Socket;
importtest.z.rpc.Hello;
publicclassRpcClientTimplementsInvocationHandler{
privateSocketsocket=null;
ObjectOutputStreamoutput=null;
ObjectInputStreaminput=null;
privateClassTserviceInterface;
privateInetSocketAddressaddr;
publicRpcClient(Stringip,Stringport){
this.addr=newInetSocketAddress(ip,Integer.parseInt(port));
}
publicTgetClientIntance(ClassTserviceInterface){
this.serviceInterface=serviceInterface;
return(T)Proxy.newProxyInstance(serviceInterface.getClassLoader(),newClass?[]{serviceInterface},this);
}
publicvoidconn()
{try{
socket=newSocket();
socket.connect(addr);
}
catch(Exceptione)
{
}
}
publicvoidclose()
{try{
if(socket!=null)socket.close();
if(output!=null)output.close();
if(input!=null)input.close();
}
catch(Exceptione)
{
}
}
Override
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
try{
conn();
output=newObjectOutputStream(socket.getOutputStream());
output.writeUTF(serviceInterface.getName());
output.writeUTF(method.getName());
output.writeObject(method.getParameterTypes());
output.writeObject(args);
input=newObjectInputStream(socket.getInputStream());
returninput.readObject();
}finally{
close();
}
}
publicstaticvoidmain(String[]args){
RpcClientclient=newRpcClient("localhost","");
Hellohello=(Hello)client.getClientIntance(Hello.class);
System.out.println(hello.sayHello("sockethellorpc"));
}
}