tomcat+RMI,求解...

icoler 2011-07-14 03:32:32
最近研究分布式编程,用的老一套的RMI。

虽然研究最后,写了两个程序(服务端和客户端),不仅能在同一台电脑上通信了,还能在不同电脑上通信。

当初不能在不同电脑上通信,因为缺少Stub。

现在是,想在Servlet中实现RMI客户端,调用远程电脑上的服务端程序。可能和上面那种实现有所不同。

希望有这方面经验的前辈能指点下。多谢!!

在Servlet中实现主要是想,当用户浏览网页时,后台调用远程程序。然后返回结果给页面。

...全文
451 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
icoler 2011-07-15
  • 打赏
  • 举报
回复
我了去,问题总算是解决了。

原来在rmi 服务器端,将文件放在了系统默认的包内,而tomcat端的Serverlet却在自定义的包内。

因此服务器报找不到类的错误。

很伤心中。

耽误大家时间了,真对不起。
icoler 2011-07-14
  • 打赏
  • 举报
回复
嗯,这么些要求还真不知道唉。

查了那么久居然这点都查到,很失败的说。

SendInterface是放在WEB-INF 下的一个classes文件夹下面吧

ps.具体是什么位置明天去看看。

还有stub拿到的。

用EJB的话,我觉得可能太麻烦了点,就一个小应用,传递点信息,所以暂时就用RMI先定着

而且不是为浏览器服务的,所以了...呵呵

很感激呢,明天上班去试试。

关于这些,ls能给俺点资料不?

网上是在是没找到详细的资料啊。很感谢。

humanity 2011-07-14
  • 打赏
  • 举报
回复
不知道你运行的环境是怎么配置的,SendInterface 是放在 WEB-INF/lib 下还是别的地方?
另外有没有添加了 java.rmi.server.codebase 并添加了RMISecurityManager 了吗?

我看了一下 RMI 类加载优先使用 Thread.currentThread().getContextClassLoader() 来加载,失败后再转用 java.rmi.server.codebase URL 类加载器加载,如果没有给 Security Manager 的话,后面的 RMI codebase 加载就不会发生。

-Djava.rmi.server.codebase=http://对方主机:8080/rmiclasses

在工作时,A 机的 JVM 发现没有类时会有一个类似这样 new URLClassLoader(codeBaseURL, Thread.currentThread().getContextClassLoader()).loadClass(...); 的类加载过程。

也就是说它会通过 RMI CodeBase 向远程主机请求类文件,因为一般分布式通信,我们都只拿到了 Interface 而 Stub 可能没有,或者说参数本身可能也是支持回调的而我们也没有 Stub。这时用 RMI CodeBase 就可以完成类加载,不过这种 RMI 类加载因为隐含地发生了网络访问(不是明确请求的),基于安全的原因,凡是可能偷偷摸摸地做的事情都必须向 JVM 请求安全权限 (Security Manager),所以这时客户端代码在执行远程调用之前一定要 System.setSecurityManager(new RMISecurityManager()); 并且在启动 java 的命令行提供 -Djava.security.policy=xxx.policy 文件。

另外如果你通信的对方支持 EJB 的话,直接使用 EJB 更合适,因为它专门为这种应用设计的。
icoler 2011-07-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ticmy 的回复:]

把SendInterface这个接口或者类拷贝一份放到client里啊
[/Quote]

假如你知道在tomcat中有成功的经验,能否告诉一二?
icoler 2011-07-14
  • 打赏
  • 举报
回复
ls,俺在两台电脑之间用rmi远程调用都成功了...

只是tomcat下出了问题,只是希望有点tomcat的方面的指点。
五哥 2011-07-14
  • 打赏
  • 举报
回复
http://damies.iteye.com/blog/51778

蛮详细的
icoler 2011-07-14
  • 打赏
  • 举报
回复
其实拷贝了。

不然编译器不会让我通过的。

感谢你这么晚了还来关注俺的问题哦,感动ing
龙四 2011-07-14
  • 打赏
  • 举报
回复
把SendInterface这个接口或者类拷贝一份放到client里啊
icoler 2011-07-14
  • 打赏
  • 举报
回复
其实是怕大家看了一堆错误头都大了,所以没敢拿出来。

RMI server端:

import java.io.*;
import java.net.Socket;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

public class ServerRmi extends UnicastRemoteObject {

public ServerRmi() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}

public static void main(String argv[]) {
try {
LocateRegistry.createRegistry(1099);
SendInterface send = new Send();
Naming.rebind("Hello", send);

System.out.println("RMI Server is ready.");
} catch (Exception e) {
System.out.println("RMI Server failed: " + e);
}
}

}



Serverlet 端:

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
SendInterface send = (SendInterface) Naming.lookup("rmi://192.168.1.2:1099/Hello");
// 调用远程方法
send.send("zyh9", "12345678", "M 9255033 xxxx");

} catch (Exception ex) {
System.out.println("HelloClient exception: " + ex);
ex.printStackTrace();
}

}


重要的就上面这两段代码了。

借口什么的话,就不贴了,免的看得心烦。

错误的话是,tomcat报没找到类文件什么的。


java.lang.NoClassDefFoundError: SendInterface
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:621)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2818)
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1159)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1647)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:247)
sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:154)
java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
java.rmi.Naming.lookup(Naming.java:84)
com.trt.android.sms.init(sms.java:100)
javax.servlet.GenericServlet.init(GenericServlet.java:212)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:270)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:269)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:302)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:163)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:117)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:619)

龙四 2011-07-14
  • 打赏
  • 举报
回复
报什么错拿出来看一下,这种调用我是常做的
icoler 2011-07-14
  • 打赏
  • 举报
回复
怎么关联?

我最想知道的是这个。多谢你的回复。
  • 打赏
  • 举报
回复
tomcat/servlet与rmi没关联
icoler 2011-07-14
  • 打赏
  • 举报
回复
很怀疑tomcat是不是需要什么特别的配置?

一直想不通中。
icoler 2011-07-14
  • 打赏
  • 举报
回复
ls您说的,俺都知道,可是实施起来就没那么简单了。

我在Servlet中的dopost中和doget中调用client程序(验证过,在不同电脑之间通信正常)中一模一样的代码。

浏览器去请求这个Servlet页面时,老出错。

一天都耗在这上面了。

ps.感谢ls几位的回复。呵呵
龙四 2011-07-14
  • 打赏
  • 举报
回复
jdk1.5开始已经不需要用rmic生成存根和骨架了

在web程序里通过rmi调用其他服务也算是常见的一种用法,一般会封装一个client,将lookup服务,调用接口都封装到client里,web应用直接使用这个client就好
ipromise_u 2011-07-14
  • 打赏
  • 举报
回复
木有弄过这方面的东西哦
皮特张 2011-07-14
  • 打赏
  • 举报
回复
帮你顶一下。

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧