1、第一步:用idea创建一个简单的demo
2、第二步:创建相应的包和类
(1)Server类实现:
package com
.ctgu_zyj
.rpc
;
import java
.io
.ObjectInputStream
;
import java
.io
.ObjectOutputStream
;
import java
.lang
.reflect
.Method
;
import java
.net
.ServerSocket
;
import java
.net
.Socket
;
import java
.util
.HashMap
;
import java
.util
.Map
;
public class Server {
public static void main(String
[] args
) throws Exception
{
ServerSocket serverSocket
= new ServerSocket(1234);
Map
<Object,Object> services
= new HashMap<Object,Object>();
services
.put(SayHelloService
.class, new SayHelloServiceImpl());
while(true){
System
.out
.println("服务提供者启动,等待客户端调用…………");
Socket socket
= serverSocket
.accept();
ObjectInputStream objectInputStream
= new ObjectInputStream(socket
.getInputStream());
String interfaceName
= objectInputStream
.readUTF();
String methodName
= objectInputStream
.readUTF();
Class
<?>[] paramterTypes
= (Class
<?>[])objectInputStream
.readObject();
Object
[] argments
= (Object
[])objectInputStream
.readObject();
System
.out
.println("客户端调用服务端接口"+interfaceName
+"的"+ methodName
+"方法");
Class
serviceClass = Class
.forName(interfaceName
);
Object serivce
= services
.get(serviceClass
);
Method method
= serviceClass
.getMethod(methodName
, paramterTypes
);
Object result
= method
.invoke(serivce
, argments
);
ObjectOutputStream stream
= new ObjectOutputStream(socket
.getOutputStream());
stream
.writeObject(result
);
System
.out
.println("服务端返回结果为"+result
);
}
}
}
(2)Server类的服务类的接口类SayHelloService类:
package com
.ctgu_zyj
.rpc
;
public interface SayHelloService {
public String
sayHello(String msg
);
}
(3)接口实现类SayHelloServiceImpl:
package com
.ctgu_zyj
.rpc
;
public class SayHelloServiceImpl implements SayHelloService {
@Override
public String
sayHello(String msg
) {
if("hello".equals(msg
)){
return "hello client";
}else{
return "bye bye";
}
}
}
(4)创建用户类Consumer:
package com
.ctgu_zyj
.rpc
;
import java
.io
.ObjectInputStream
;
import java
.io
.ObjectOutputStream
;
import java
.lang
.reflect
.Method
;
import java
.net
.Socket
;
public class Consumer {
public static void main(String
[] args
) throws Exception
{
String interfaceName
= SayHelloService
.class.getName();
Method method
= SayHelloService
.class.getMethod("sayHello",
java
.lang
.String
.class);
Object
[] argments
= {"hello"};
Socket socket
= new Socket("127.0.0.1",1234);
ObjectOutputStream outputStream
= new ObjectOutputStream(socket
.getOutputStream());
outputStream
.writeUTF(interfaceName
);
outputStream
.writeUTF(method
.getName());
outputStream
.writeObject(method
.getParameterTypes());
outputStream
.writeObject(argments
);
System
.out
.println("发送信息到服务端,发送的信息为:"+argments
[0]);
ObjectInputStream inputStream
= new ObjectInputStream(socket
.getInputStream());
Object object
= inputStream
.readObject();
System
.out
.println("服务返回的结果为"+object
);
}
}
3、第三步:准备运行项目
4、第四步:总结
简单来讲整个过程就是,Server服务提供端运行,将服务实例化后放在Services的Map当中,然后通过一个while循环不断地接受到来地请求,得到接受到地参数,然后再通过Java地反射取得服务接口所需要调用地方法,执行后再将结果返回给服务地消费者。