rmi手写框架

RMI(remote method invocation),可以认为是RPC的Java版本

RMI使用的是JRMP(Java Remote Messageing Protocol),JRMP是专门为java定制的通信协议,所以是纯java的分布式解决方案。

序列化采用的是JAVA原生的Serializable,所以性能比较差。底层用的是BIO。

Skeleton和Stub是一定要的,通过代理调用来屏蔽通信细节的
public class User {
    private int age;
    public int getAge() throws IOException {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
public class UserServer extends User{

    public static void main(String[] args) {
        UserServer userServer = new UserServer();
        userServer.setAge(18);

        User_Skeleton user_skeleton = new User_Skeleton(userServer);
        user_skeleton.start();
    }
}

public class User_Skeleton extends Thread{

    private UserServer userServer;

    public User_Skeleton(UserServer userServer){
        this.userServer = userServer;
    }

    @Override
    public void run() {
        ServerSocket serverSocket = null;
        ObjectInputStream read = null;
        ObjectOutputStream objectOutputStream = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(8888);
            socket = serverSocket.accept();
            while (socket != null) {
                read = new ObjectInputStream(socket.getInputStream());
                String method = (String) read.readObject();
                if (method.equals("age")){
                    int age = userServer.getAge();
                    objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
                    objectOutputStream.writeInt(age);
                    objectOutputStream.flush();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                if (serverSocket != null){
                    serverSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
public class UserClient {

    public static void main(String[] args) throws IOException {
        User user = new User_stub();
        int age = user.getAge();
        System.out.println(age);
    }
}
public class User_stub extends User{

    private Socket socket;

    public User_stub() throws IOException {
        socket = new Socket("localhost",8888);
    }

    public int getAge() throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
        objectOutputStream.writeObject("age");
        objectOutputStream.flush();
        ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
        return objectInputStream.readInt();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_26857649/article/details/81979377
今日推荐