1.server
package com.xiaogang.server;
public interface IService {
public String service(String str);
}
package com.xiaogang.server;
public class ServiceImpl implements IService{
@Override
public String service(String str) {
return "ServiceWrappered["+str+"]"+System.currentTimeMillis();
}
}
package com.xiaogang.server;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
public class ServiceProvider {
public static void main(String[] args) {
ServerSocket server = null;
ObjectOutputStream out = null;
try {
server = new ServerSocket(8080);
Socket socket =null;
int numAccept=0;
while(numAccept<5){
System.out.println("--------------Service started---------------");
socket = server.accept();
numAccept++;
ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
String interfaceName = input.readUTF(); //接口名称
String methodName = input.readUTF(); //方法名称
Class<?>[] parameterType = (Class<?>[]) input.readObject(); //方法类型
Object[] arguments = (Object[]) input.readObject(); //参数列表
System.out.println("server接收到的参数:"+Arrays.toString(arguments));
//根据接口名称获取class
Class<?> serviceInterfaceClass = Class.forName(interfaceName);
//根据方法名称和参数类型反射得到方法
Method method = serviceInterfaceClass.getMethod(methodName, parameterType);
//服务实例化(这里做简单处理,正常应该根据得到的接口名称serviceInterfaceClass获取对应的service,但本demo只提供一个服务)
IService service = new ServiceImpl();
//反射执行这个方法
Object result = method.invoke(service, arguments);
//写会处理结果
out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(result);
}
System.out.println("--------------Service stoped---------------");
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
if(server!=null){
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
server = null;
}
}
}
}
2.client
package com.xiaogang.client;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.Socket;
import com.xiaogang.server.IService;
public class ClientCaller {
public static void main(String[] args) {
try {
//接口名称
String interfaceName = IService.class.getName();
//接口方法
Method method = IService.class.getMethod("service", java.lang.String.class);
//参数
Object[] arguments = {"hello"};
Socket socket = new Socket("10.40.30.200",8080);
//发送请求
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeUTF(interfaceName);
out.writeUTF(method.getName());
out.writeObject(method.getParameterTypes());
out.writeObject(arguments);
//获取结果
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
Object returnObject = inputStream.readObject();
System.out.println("client recieve: "+returnObject.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}