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();
}
}