关于java6rmi的信息
本篇文章给大家谈谈java6rmi,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、JAVA RMI(远程方法调用)在OSI模型的哪一层
- 2、Java RMI调用远程程序抛出异常
- 3、运行Think In Java中的 RMI 示例可能产生的几种异常及解决
- 4、java常用类库有哪些
- 5、java RMI问题
JAVA RMI(远程方法调用)在OSI模型的哪一层
OSI模型?这个怎么说呢 看你走的是什么协议了,我觉得多多少少每层都会涉及到的,毕竟7层也不是完全分离,如果硬要选一个,我感觉是传输层吧,这里是协议走的核心。随便一说,不知道对不对,呵呵。
Java RMI调用远程程序抛出异常
背景要求:定时监控远程主机上mongodb数据库内存使用的情况,当内存使用过大时暂停逻辑处理线程后启动内存空间的释放处理线程,释放完成后再启动逻辑处理线程。
操作系统:CentOS 64bit (Linux)
步骤(代码省略):
1.创建Socket远程服务器
2.创建客户端
配置:
#查找对象stub端口
RMI_PORT=9902
#服务端口
RMI_SERV_RMI_PORT=9903
#注册服务地址端口要和查找对象stub端口一致
RMI_URL=rmi://192.168.0.118:9902/MongoServer
#绑定IP
RMI_IP=192.168.0.118
#检查内存shell
RMI_MEMQUERY_COMMAND=sh /home/test/BI/smartshow14/MongoDBRMIServer/memquery.sh
#释放内存shell
RMI_MEMFREE_COMMAND=sh /home/test/BI/smartshow14/MongoDBRMIServer/memclear.sh
#释放内存容量阀值,单位M
RMI_MEM_CAPACITY_LIMIT=3000
3.启动服务器
客户端线程通过 rmi://192.168.0.118:9902/MongoServer 访问时出现异常:
--定时扫描MONGODB内存线程--:开始运行!
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: com.linkage.iface.IMongoDBScan (no security manager: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:84)
at com.linkage.querytool.QueryRMICaller.ramCapacityScan(QueryRMICaller.java:87)
at com.linkage.querytool.MongoDBARMScanThread$TimerWorkTask.run(MongoDBARMScanThread.java:94)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
Caused by: java.lang.ClassNotFoundException: com.linkage.iface.IMongoDBScan (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:535)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1530)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1492)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
... 6 more
--定时扫描MONGODB内存线程--:处理结束!
=======================================================================================================
--定时扫描MONGODB内存线程--:开始运行!
java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.0.118:9902 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
at java.net.Socket.connect(Socket.java:524)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.init(Socket.java:375)
at java.net.Socket.init(Socket.java:189)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:84)
at com.linkage.querytool.QueryRMICaller.ramCapacityScan(QueryRMICaller.java:89)
at com.linkage.querytool.MongoDBARMScanThread$TimerWorkTask.run(MongoDBARMScanThread.java:94)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
--定时扫描MONGODB内存线程--:处理结束!
============================================================================================================
--定时扫描MONGODB内存线程--:开始运行!
java.security.AccessControlException: access denied (java.lang.RuntimePermission createSecurityManager)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.init(SecurityManager.java:282)
at java.rmi.RMISecurityManager.init(RMISecurityManager.java:45)
at com.linkage.querytool.QueryRMICaller.ramCapacityScan(QueryRMICaller.java:88)
at com.linkage.querytool.MongoDBARMScanThread$TimerWorkTask.run(MongoDBARMScanThread.java:94)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
--定时扫描MONGODB内存线程--:处理结束!
==========================================================================================================
以上异常都有可能出现,通过以下方式可解除问题:
1.在客户端程序前打开安全管理器:
try {
System.setSecurityManager(new java.rmi.RMISecurityManager());
mds = (IMongoDBScan) Naming.lookup(urlStr);
} catch (MalformedURLException e) {
//..........
}
2.修改/usr/java/jdk1.6.0_21/jre/lib/security/java.policy后重启
grant {
permission java.security.AllPermission;
}
运行Think In Java中的 RMI 示例可能产生的几种异常及解决
下面将列出可能产生的异常,并说明解决办法,如读者在执行当中还遇到其他未列出的异常,可留言告知,吾将尽力而为。
首先把代码PerfectTime和DisplayPerfectTime 中的//colossus:2005/PerfectTime改为//localhost:2005/PerfectTime ,因为colossus为机器名,所以改为localhost指向本机,不然找不到主机colossus的。
已经用命令 RMIC 生成PerfectTime_Stub.class,并且执行了命令 rmiregistry 2005
1. 执行java PerfectTime出现异常 java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:2005 connect,resolve)
无法解析和连接到127.0.0.1的2005端口上,原因是在PerfectTime中设置了安全管理器<System.setSecurityManager(new RMISecurityManager());>,可是又没有设置访问的策略,解决办法有四(解决这种异常的办法同样适用于 DisplayPerfectTime):
(1) 可以把代码System.setSecurityManager(new RMISecurityManager());去掉,不设置安全管理器
(2) 修改JRE的安全策略文件,这就要求你能确定执行时是用的哪个JRE,比如在Eclipse中用JDK是c:\Java\jdk1.5.0_06,相应的安全策略文件就是c:\java\jdk1.5.0_06\jre\lib\security\java.policy,如果是Applet中的java 程序就应该是在 jre 目录中,如文件C:\Java\jre1.5.0_06\lib\security\java.policy。修改安全策略文件,在grant {},大括号中加上permission java.net.SocketPermission "localhost:2005","connect,resolve";
(3) 建立自己的策略文件,如c:\MyPolicy.policy ,内容为:grant {permission java.net.SocketPermission "localhost:2005","connect,resolve";}执行PerfectTime时用命令 java -Djava.security.policy=c:\MyPolicy.policy PerfectTime 指定了安全策略文件
System.setSecurityManager (new RMISecurityManager() {
public void checkConnect (String host, int port) {}
public void checkConnect (String host, int port, Object context) {}});当然最简单的解决方法莫过于第一种。
2. 同样是执行 PerfectTime 出现的异常
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: PerfectTime_Stub
很多人对这个问题有些莫名其妙,因为明明看到 PerfectTime_Stub 和 PerfectTime 这两个类是在同一个目录中,并且classpath 也有设置当前目录,按理既然能加载 PerfectTime 类执行,就能加载到 PerfectTime_Stub吧,为什么还提示ClassNotFound呢?其实类 PerfectTime_Stub并非由PerfectTime执行行直接加载,而是PerfectTime在向RMI注册时,要求 rmiregistry去加载 PerfectTime_Stub类的,理解了这一层次上的意义就会知道其实 PerfectTime_Stub是为 rmiregistry所用的。所以解决办法是:
(1) 在执行 rmiregistry 之前,设置classpath让能查找到PerfectTime_Stub类,如在同一Dos窗口中,假设 PerfectTime_Stub类是在E:\workspace\TestRMI\bin目录中,执行过程那就是
C:\Documents and Settings\unmiset classpath=%classpath%;E:\workspace\TestRMI\bin
C:\Documents and Settings\unmirmiregistry 2005
(2) 或者在命令行中先进入到 PerfectTime_Stub类所在的目录,然后再执行 rmiregistry (这种方法实质是与上面一样的,只是恰当的应用的classpath中的当前目录 "." ),执行过程如下
C:\Documents and Settings\unmie:
E:\cd E:\workspace\TestRMI\bin
E:\workspace\TestRMI\binrmiregistry 2005参看:rmiregistry was finding the stubs in its CLASSPATH
3. 执行客户端程序 DisplayPerfectTime 出现异常 java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1276 connect,resolve),同时在服务器端也产生异常 Exception in thread "RMI TCP Connection(6)-127.0.0.1" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1296 accept,resolve)
直接能想到的解决办法是把127.0.0.1:1276,127.0.0.1:1276的解析连接权限也加上,方法可取第 1 种异常所列的方法,但这个端口是随机的。在此解析一下这些端口的用途,2005是直接指定的供客户端查找注册的服务对象引用的端口,这是固定的,而上面产生的在客户端和服务器上的1276和1296的端口,是随机的,是在方法调用时真正的客户端与提供服务的服务器(而非注册服务器)之间的数据通信的端口。
为了满足上面的端口应用,可以在安全策略文件中只加上 permission java.net.SocketPermission "localhost:*","accept,connect,resolve"; 允许在所有端口上的接受,连接,解析。再如果要访问的IP很多,又要写成 permission java.net.SocketPermission "*:*","accept,connect,resolve"; 方便。
4.执行客户端程序 DisplayPerfectTime出现异常 java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:java.io.EOFException,这种异常应该比较少见,出现情况是客户端有权限访问服务提供端的某个端口,而服务提供端却无权限在某个端口上或给那个客户端提供服务造成的,解决办法把客户端和服务器的安全策略文件都改为能访问任何端口就行。
java常用类库有哪些
java.lang.*
Java编程语言的基本类库
java.util.*
包括集合类、时间处理模式、日期时间工具等各类常用工具包
这两个是最基本的类库,学习java要熟悉这两个类库。
下面也是一些常用的:
java.awt.*
提供了创建用户界面以及绘制和管理图形、图像的类(现在已不常用)
javax.swing.*
提供了一系列轻量级的用户界面组件,是目前Java用户界面常用的包
现在更多用swing来构建java用户界面。
java.io.*
提供了通过数据流、对象序列以及文件系统实现的系统输入、输出
java.sql.*
提供了访问和处理来自于Java标准数据源数据的类
java.math.*
提供了简明的整数算术以及十进制算术的基本函数
java.rmi.*
提供了与远程方法调用相关的所有类
java.net.*
提供了用于实现网络通讯应用的所有类
java RMI问题
rmiregistry的默认端口是1099....你这里指定的端口是3000
所以你在CMD中要这样 start rmiregistry 3000
或者将你的Naming.bind("/localhost:3000/getStudent", obj);
改为Naming.bind("rmi://localhost:1099/getStudent", obj);
额,突然发现你没有在前面加rmi前缀...不知道这个有关系没~~~~
额,查了下,不加rmi前缀也可以,加了rmi前缀后会如果你没有指定端口就会将obj注册到主机上监听1099端口的rmiregistry进程上去...
如果还出现错误就不知道了
java6rmi的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、java6rmi的信息别忘了在本站进行查找喔。