模拟RPC-01

使用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'}

  

猜你喜欢

转载自www.cnblogs.com/huan30/p/12682752.html
RPC