RMI(Remote Method Invocation),远程方法调用,即本地调用远程主机的服务,使用RMI能实现如同在调用本地方法似的效果,也就是说能够实现分布式应用。
一。Chat 远程方法接口需要继承Remote接口,并且远程接口的所有方法必须抛出RemoteException
package com.template.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 11-8-4
* Time: 下午9:04
*/
public interface Chat extends Remote {
void send(String message) throws RemoteException;
String receive() throws RemoteException;
}
二。ChatImpl 远程接口的实现类 需要继承UnicastRemoteObject类,并实现Chat接口
package com.template.rmi;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 11-8-4
* Time: 下午9:05
*/
public class ChatImpl extends UnicastRemoteObject implements Chat {
private Logger logger = LoggerFactory.getLogger(ChatImpl.class);
protected ChatImpl() throws RemoteException {
super();
}
@Override
public void send(String message) throws RemoteException {
logger.info("Sending a message!");
logger.info(message);
logger.info("Sended a message!");
}
@Override
public String receive() throws RemoteException {
logger.info("Received a message!");
return "This is a received message content!";
}
}
三。ChatServer 远程服务注册
package com.template.rmi;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 11-8-4
* Time: 下午9:10
*/
public class ChatServer implements Runnable {
private Logger logger = LoggerFactory.getLogger(ChatServer.class);
@Override
public void run() {
try {
logger.info("Server start!");
logger.info("Initialize chat service!");
ChatImpl chat = new ChatImpl();
logger.info("Bind the chat service to the server!");
Naming.rebind("chat", chat);
logger.info("Server has started the chat service!");
} catch (RemoteException e) {
logger.error(e.getMessage());
} catch (MalformedURLException e) {
logger.error(e.getMessage());
}
}
}
四。ChatClient 本地调用远程服务
package com.template.rmi;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 11-8-4
* Time: 下午9:10
*/
public class ChatClient implements Runnable {
private Logger logger = LoggerFactory.getLogger(ChatClient.class);
@Override
public void run() {
try {
logger.info("Find chat service from server!");
Chat chat = (Chat) Naming.lookup("//127.0.0.1/chat");
logger.info("Sending a message to the server!");
chat.send("This is a message from client to server!");
logger.info("Sended a message to the server!");
logger.info("Receive a message from server!");
String message = chat.receive();
logger.info("The message received from server is : ");
logger.info(message);
} catch (NotBoundException e) {
logger.error(e.getMessage());
} catch (MalformedURLException e) {
logger.error(e.getMessage());
} catch (RemoteException e) {
logger.error(e.getMessage());
}
}
}
五。Main
package com.template.rmi;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 11-8-4
* Time: 下午10:48
*/
public class Main {
public static void main(String[] args) {
Runnable chatServer = new ChatServer();
Thread server = new Thread(chatServer);
server.run();
Runnable chatClient = new ChatClient();
Thread client = new Thread(chatClient);
client.run();
}
}
六。启动rmiregistry服务器
七。运行Main主类
八。实现效果
附:如果想要正确启动远程服务,需要对ChatImpl类进行远程方法调用的编译,即使用rmic命令,生成ChatImpl的Stub,即存根。当然,如果使用的IDE,那IDE会帮我们做这一步的。其次,为了正确使用远程服务,需要确保远程方法调用服务器在正确的位置启动,即能够找到Stub存根的目录下。启动远程方法调用,需要使用rmiregistry命令。
- 大小: 20 KB
分享到:
相关推荐
java rmi java rmijava rmi javajava rmi java rmi rmi
RMI简单实例RMI简单实例RMI简单实例
完整的Rmi调用示例,极难得的Rmi应用示例
rmi的详细例子,rmi的详细用法,一看就懂
RMI 规范 RMI 详细介绍 共10章
RMI教程 Java RMIRMI教程 Java RMIRMI教程 Java RMIRMI教程 Java RMIRMI教程 Java RMI
rmi小程序,RMI文档,为RMI初学者使用
RMI远程方法调用RMI远程方法调用RMI远程方法调用RMI远程方法调用RMI远程方法调用
1. Unpack RMI.rar and put the package "features" and "plugins" under the package "net.genady.rmi_2.0.2.1" to <%eclipse%> directory; 2. Copy rmi.jar and lic.jar under the package "crack" to ...
Spring-RMI (RMI调用, HTTP调用) 本人测试过了
本项目使用socket直接发送数据包来攻击rmi,通过反序列化攻击rmi,双击直接运行,对1099端口的rmi服务直接进行漏洞检测。
java rmi上传文件 在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sockets两种之间,其中RMI的灵活性不高,客户端和服务器端都必须是java编写...
Weblogic Server与RMI RMI的使用介绍
Java编程rmi实例,给出远程方法调用技术在java方面的具体例子。
java RMI
spring RMI 简单例子
检测javaRMI反序列化漏洞
分布式实验报告RMI.docx
spring RMI 服务(自动把service发布为RMI服务),本例子加入了spring的预处理,可以根据自己的需要把指定位置的bean发布为 RMI 服务。
Java中RMI的实现机制Java中RMI的实现机制Java中RMI的实现机制Java中RMI的实现机制