rmi服务端怎么运行起来?很古怪的错,没法解决,请指教(100分)

  • 主题发起人 主题发起人 yuanjun
  • 开始时间 开始时间
Y

yuanjun

Unregistered / Unconfirmed
GUEST, unregistred user!
以前用记事本写rmi,运行没问题,现在反而不行了。
我是用jbuilder4写了个简单的rmi程序,在运行了rmiregistry后,
开始运行implement这边的服务,但是运行到rebind这步时出了异常:
Exception occurred: java.rmi.RemoteException: access denied (java.net.SocketPermission 192.10.10.103:1099 connect,resolve)
我想是permission的问题,就写了个rmi.policy
grant {
permission java.security.AllPermission;
}
又在project property中加入了这句:
-Djava.security.policy=file:/opt/jbuilder4/samples/RMI/rmi.policy
可是就编译不过去,总是要求rmi.policy是个类或接口的定义。
而jbuilderz带的一个rmi sample倒是能编译过去,policy什么的都设好了,仍然有上述异常。
这个问题已经困扰我好久,sun的java主页上也没有关于这个问题的说明,
请高手指教。
 
还有一个小问题,如果调用一个函数想要返回两样东西,
譬如说,执行一个数据库查询,既要返回查询结果,又要返回查询所用的时间。
java里没有引用传递,靠返回值只能返回一个结果,另一个怎么返回?
我用的办法是传入一个对象,在函数里修改这个对象的属性,达到返回另一个结果的目的。
请问有没有更好的办法?
 
〉java里没有引用传递
?????????????????????
 
只有对象传递,没有基本类型的传递。
 
〉java里没有引用传递
好像java中,对象传引用,基本类型传值
 
to JJams_King:
你说得对。如果想传基本类型的变量引用,怎么办?
以前有人说过自己造一个pointer的类,但是很麻烦。
 
用基本类型的包装类。int->Integer.....
 
基本类型的确烦,看看这:
public Object invoke(Method method,Object[] args) throws InvocationTargetException
{ /*****/ }
参数args是一个Object列表,对于基本类型,则传的是对应的包装对象。
参数method的getParameterTypes返回的却是基本类型。
 
to eguy:
int->Integer可以,但是Integer也没有setValue这种函数将其值改变,还是不行,
能不能写一段代码让我看看,通过一个swap函数将两个值交换。
to all:
我那个rmi的问题有人回答吗?这可是我最最头痛的,要解决不了就没法往下作了。
 
我和你遇到了一样的问题,我也很关心。jb的例子也不行,总是出现:
Exception occurred: java.rmi.RemoteException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
 
to bluepeach:
同志啊同志!!
共同关心,一起进步。
还有,哪位大侠比较清楚permission的细节的,请讲一下。
 
>能不能写一段代码让我看看,通过一个swap函数将两个值交换。
<a href="/delphibbs/DispQ.asp?LID=324910">如何实现引用传递</a>
 
一、关于一个swap函数将两个值交换,需要构造一个新类Int。DEMO如下:
class Int {
int n;
Int(int x) { n = x;
}
public String toString() {
return Integer.toString(n);
}
}
public class swapdemo{
static void swap(Int i1,Int i2){
int temp;
temp=i1.n;
i1.n=i2.n;
i2.n=temp;
System.out.println("in swap i1="+i1+";
i2="+i2);
}
public static void main(String[] args){
Int i1=new Int(3);
Int i2=new Int(6);
System.out.println("before swap i1="+i1+";
i2="+i2);
swap(i1,i2);
System.out.println("after swap i1="+i1+";
i2="+i2);
}}
二、>>可是就编译不过去,总是要求是rmi.policy个类或接口的定义
把rmi.policy从项目中去掉。
其实rmi.policy不以java为后缀,JB应该不会编译它的。
 
只要把policy文件放在正确的位置,而且project的-D属性相应设好,是可以运行的。
 
to eguy:
policy文件应该放在什么位置才算正确,还是随便放个地方,而在project -D里指明就可以了。
project -D指定的路径为什么是file:/opt/...这种格式的?opt是什么意思?
 
policy文件随便放个地方,而在project -D里指明就可以了。
>>file:/opt/...这种格式的?opt是什么意思
原来如此,这里opt没什么特别的,只是当前目录的一个子目录而已。
你出现错误的原因肯定是你的policy文件在-D里没有指对。
如果你的policy在c:/tmp里,就这样指定:
-Djava.security.policy=file://c:/tmp/rmi.policy
 
谢谢eguy!yuanyun:我搞定了,只是-Djava.security.policy=file://c:/tmp/rmi.policy
应该改为-Djava.security.policy=file:/c:/tmp/rmi.policy,原来多了个"/"!
另外:我发现rmi调用如果同时打开两个服务器,这时运行客户程序的话,它始终是在调用最后
打开的服务器程序,而不象corba,自动的在几个程序中轮转。不知大家的是不是都是这样?
如果确实的话,那么rmi是比corba差不少啊。
 
噢,不对!是codebase必须向那样写,多个"/"或者少了file都不行。而policy可以没有file。
不明白,为什么这么乱?
但我现在还有很多不明白的地方:
1.用记事本写rmi程序的话,用rmic RemImpl可以生成stub和skel两个class,但是jb中为什么只有1个stub?
2.如果去掉-Djava.security.policy=e:/jbuilder4/samples/RMI/SimpleRMI.policy,那么会因为安全性的问题错误
如果去掉-Djava.rmi.server.codebase=file:/e:/jbuilder4/samples/RMI/classes/,那么会
在执行服务器程序的时候找不到stub。于是,eguy,后来,我在命令行中输入上面一堆参数,
果然可以执行了。但是难道每次都要输入那么长的参数吗?
3.我的程序没有用policy文件,但jb的程序用了。请问rmi程序有什么限制,以及什么时候应该
用policy文件?应该怎样设置policy文件?
4.我用记事本写的程序为什么放在jb中无法编译?
 
很高兴这个问题解决了。
不过我也有和bluepeach一样的疑问,请eguy继续指点。
再讨论清楚一点就发分了。
有请坛主。
 
哈哈,我白搭进取100大元了。我的也解决了。
需求相同,请继续讨论。
:)
 
后退
顶部