使用Socket模拟最基础的Rpc调用
1.基础准备
public interface IUserService { User getUserById (int id); }
@Data public class User { private int id; private String name; public User(int id) { } public User(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
2.模拟服务端
/** * 模拟服务端 */ public class Server { private static boolean running = true; public static void main(String[] args) throws Exception{ ServerSocket serverSocket = new ServerSocket(8888); while (running){ Socket s = serverSocket.accept(); System.out.println("服务端监听提示:"+s.getLocalSocketAddress().toString()); System.out.println(s.getInetAddress().toString()); System.out.println(s.getLocalAddress().toString()); System.out.println("客户端请求地址:"+s.getRemoteSocketAddress().toString()); System.out.println("我是清晰分明的分界线"); System.out.println(); process(s); s.close(); } serverSocket.close(); } private static void process(Socket s) throws Exception { // 拿到输入流 InputStream inputStream = s.getInputStream(); OutputStream outputStream = s.getOutputStream(); // 组建数据输入流对象 DataInputStream dataInputStream = new DataInputStream(inputStream); DataOutputStream dataOutputStream = new DataOutputStream(outputStream); // 拿到请求数据 int id = dataInputStream.readInt(); IUserService userService = new UserServiceImpl(); User user = userService.getUserById(id); // 输出数据 dataOutputStream.writeInt(user.getId()); dataOutputStream.writeUTF(user.getName()); // 刷新 dataOutputStream.flush(); dataOutputStream.close(); dataInputStream.close(); outputStream.close(); inputStream.close(); } }
3.客户端调用
/** * 模仿请求端 */ public class Client { public static void main(String[] args) throws Exception { Socket s = new Socket("127.0.1.1",8888); // 创建字节数组输出流 ByteArrayOutputStream bout = new ByteArrayOutputStream(); // 创建数据输出流包装 DataOutputStream dataOutputStream = new DataOutputStream(bout); // 写入请求值 dataOutputStream.writeInt(1); s.getOutputStream().write(bout.toByteArray()); s.getOutputStream().flush(); // 读取 创建数据输入流 DataInputStream dataInputStream = new DataInputStream(s.getInputStream()); int id = dataInputStream.readInt(); String name = dataInputStream.readUTF(); User user = new User(id, name); System.out.println("请求返回数据-"+user); dataInputStream.close(); dataOutputStream.close(); bout.close(); s.close(); } }
4.结果
服务端监听提示:/127.0.1.1:8888 /127.0.0.1 /127.0.1.1 客户端请求地址:/127.0.0.1:55967 我是清晰分明的分界线 服务端监听提示:/127.0.1.1:8888 /127.0.0.1 /127.0.1.1 客户端请求地址:/127.0.0.1:56024 我是清晰分明的分界线 ************** 请求返回数据-User{id=1, name='rpc_name'}