当前位置: 技术问答>java相关
第一个rmi程序就出错,请大虾帮忙!
来源: 互联网 发布时间:2015-10-31
本文导语: Product.java ------------------------ import java.rmi.*; public interface Product extends Remote { String getDescription () throws RemoteException; } --------------------------- ProductServer.java ------------------ import java.rmi.*; import java.rmi.server.*; import ...
Product.java
------------------------
import java.rmi.*;
public interface Product extends Remote
{
String getDescription () throws RemoteException;
}
---------------------------
ProductServer.java
------------------
import java.rmi.*;
import java.rmi.server.*;
import sun.applet.*;
public class ProductServer
{
public static void main(String[] args)
{
try
{
System.out.println("Constructing server implementations ...");
ProductImpl p1 = new ProductImpl("Blackwell Toaster");
ProductImpl p2 = new ProductImpl("ZapXpress Microware Oven");
System.out.println("Binding server implementations to registry...");
Naming.rebind("toaster", p1);
Naming.rebind("microwave", p2);
System.out.println("Waitting for invocations from clients...");
}
catch(Exception e)
{
System.out.println("Error: " + e.toString());
}
}
}
--------------------------------
ProductImpl.java
-------------------------------
import java.rmi.*;
import java.rmi.server.*;
public class ProductImpl extends UnicastRemoteObject implements Product
{
private String name;
public ProductImpl(String name) throws RemoteException
{
this.name = name;
}
public String getDescription () throws RemoteException
{
return "I am a " + name + ", buy me!";
}
}
------------------
ProductClient.java
-------------------
import java.rmi.*;
import java.rmi.server.*;
public class ProductClient
{
public static void main(String[] args)
{
System.setSecurityManager(new RMISecurityManager());
String url = "rmi://localhost/";
try
{
//Product c1 = (Product)Naming.lookup(url + "toaster");
Product c1 = (Product)Naming.lookup(url + "toaster");
Product c2 = (Product)Naming.lookup(url + "microwave");
System.out.println(c1.getDescription());
System.out.println(c2.getDescription());
}
catch(Exception e)
{
System.out.println("Error: " + e.toString());
}
System.exit(0);
}
}
-----------------------------
javac Product*.java
rmic -v1.2 ProductImpl
start rmiregistry
start ProductServer
出现错误
java.rmi.ServerException:Server RemoteException;nested exception is:
java.rmi.UnmarshalException:error unmarshalling arguments;nested exception is:
java.lang.ClassNoFoundException:ProductImpl_Stub
请问怎么解决!
------------------------
import java.rmi.*;
public interface Product extends Remote
{
String getDescription () throws RemoteException;
}
---------------------------
ProductServer.java
------------------
import java.rmi.*;
import java.rmi.server.*;
import sun.applet.*;
public class ProductServer
{
public static void main(String[] args)
{
try
{
System.out.println("Constructing server implementations ...");
ProductImpl p1 = new ProductImpl("Blackwell Toaster");
ProductImpl p2 = new ProductImpl("ZapXpress Microware Oven");
System.out.println("Binding server implementations to registry...");
Naming.rebind("toaster", p1);
Naming.rebind("microwave", p2);
System.out.println("Waitting for invocations from clients...");
}
catch(Exception e)
{
System.out.println("Error: " + e.toString());
}
}
}
--------------------------------
ProductImpl.java
-------------------------------
import java.rmi.*;
import java.rmi.server.*;
public class ProductImpl extends UnicastRemoteObject implements Product
{
private String name;
public ProductImpl(String name) throws RemoteException
{
this.name = name;
}
public String getDescription () throws RemoteException
{
return "I am a " + name + ", buy me!";
}
}
------------------
ProductClient.java
-------------------
import java.rmi.*;
import java.rmi.server.*;
public class ProductClient
{
public static void main(String[] args)
{
System.setSecurityManager(new RMISecurityManager());
String url = "rmi://localhost/";
try
{
//Product c1 = (Product)Naming.lookup(url + "toaster");
Product c1 = (Product)Naming.lookup(url + "toaster");
Product c2 = (Product)Naming.lookup(url + "microwave");
System.out.println(c1.getDescription());
System.out.println(c2.getDescription());
}
catch(Exception e)
{
System.out.println("Error: " + e.toString());
}
System.exit(0);
}
}
-----------------------------
javac Product*.java
rmic -v1.2 ProductImpl
start rmiregistry
start ProductServer
出现错误
java.rmi.ServerException:Server RemoteException;nested exception is:
java.rmi.UnmarshalException:error unmarshalling arguments;nested exception is:
java.lang.ClassNoFoundException:ProductImpl_Stub
请问怎么解决!
|
以前给别人写了这个step by step, 现在已经用过很多次了,
你看看吧
例子是Core Java V2 C5的例子
我主要使用http的80端口方式传输,其他方法,如ftp,classfileserver暂时没时间说了
1。 首先,保证你正在打开http服务,如果你是在用windows2000,
先到添加安装程序里添加windows组件,安装IIS,然后点击资源管理器
里的管理工具,点击service,保证IIS Admin Service已经打开了,
这是你就可以设定你的http服务了,点击资源管理器里的管理工具,
点击Internet Service Manager,右键单击默认http服务,点击属性,
你会看到一些相关信息,比如端口号 80等,home directory那页,
保证read复选框被选定,最好把Directory Browsing也打开(调试方便)。
这些都做完了,你在C:Inetpubwwwroot里建一个目录download,把Product.class,ProductImpl_Stub.class
拷进去,这时你可以测试一下,http服务是否可以下载你的stub,
你打开一个IE浏览器,输入http://localhost:80/download,
(如果刚才你没改80,那么http://localhost/download这样也可以)
这时,如果刚才你打开了Directory Browsing,你就可以看到类似这样的东西
localhost - /download/
------------
[To Parent Directory]
Saturday, September 14, 2002 9:08 PM 219 Product.class
Saturday, September 14, 2002 9:09 PM 2876 ProductImpl_Stub.class
-----------
点击ProductImpl_Stub.class,会谈出一个对话框让你下载,http80这就搞定了!这表示你的web服务可以让你写的rmi程序的客户端下载stub了。
2。 把服务端需要的类放到一个server目录里,这个目录不用放到wwwroot里,放到你任何的地方,比如d:server,
以Core Java的第5章为例,你要放入这些文件:
Product.class
ProductServer.class
ProductImpl.class
ProductImpl_Stub.class
3。 随便找个地方建一个client目录,如d:client,把客户端程序放进去
Product.class
ProdcutClient.class
client.policy
其中client.policy要保证允许客户端访问http服务,默认情况下,http用80断口,所以,你的client.policy一般可以这样写
grant
{ permission java.net.SocketPermission
"*:1024-65535", "connect,accept";
permission java.net.SocketPermission
"*:80", "connect,accept";
};
4。 然后开一个dos窗口,键入set classpath=回车,这时你的CLASSPATH被清空,防止混乱
例如
C:>set classpath=
C:>set classpath
Environment variable classpath not defined
C:>rmiregistry
5。 然后再server目录里启动服务端:
E:Server>java -Djava.rmi.server.codebase=http://localhost/download/ ProductServer
Constructing server implementations...
Binding server implementations to registry...
Waiting for invocations from clients...
6。 然后再client目录里启动客户端
E:Client>java -Djava.security.policy=client.policy ProductClient
I am a Blackwell Toaster. Buy me!
I am a ZapXpress Microwave Oven. Buy me!
结束
你看看吧
例子是Core Java V2 C5的例子
我主要使用http的80端口方式传输,其他方法,如ftp,classfileserver暂时没时间说了
1。 首先,保证你正在打开http服务,如果你是在用windows2000,
先到添加安装程序里添加windows组件,安装IIS,然后点击资源管理器
里的管理工具,点击service,保证IIS Admin Service已经打开了,
这是你就可以设定你的http服务了,点击资源管理器里的管理工具,
点击Internet Service Manager,右键单击默认http服务,点击属性,
你会看到一些相关信息,比如端口号 80等,home directory那页,
保证read复选框被选定,最好把Directory Browsing也打开(调试方便)。
这些都做完了,你在C:Inetpubwwwroot里建一个目录download,把Product.class,ProductImpl_Stub.class
拷进去,这时你可以测试一下,http服务是否可以下载你的stub,
你打开一个IE浏览器,输入http://localhost:80/download,
(如果刚才你没改80,那么http://localhost/download这样也可以)
这时,如果刚才你打开了Directory Browsing,你就可以看到类似这样的东西
localhost - /download/
------------
[To Parent Directory]
Saturday, September 14, 2002 9:08 PM 219 Product.class
Saturday, September 14, 2002 9:09 PM 2876 ProductImpl_Stub.class
-----------
点击ProductImpl_Stub.class,会谈出一个对话框让你下载,http80这就搞定了!这表示你的web服务可以让你写的rmi程序的客户端下载stub了。
2。 把服务端需要的类放到一个server目录里,这个目录不用放到wwwroot里,放到你任何的地方,比如d:server,
以Core Java的第5章为例,你要放入这些文件:
Product.class
ProductServer.class
ProductImpl.class
ProductImpl_Stub.class
3。 随便找个地方建一个client目录,如d:client,把客户端程序放进去
Product.class
ProdcutClient.class
client.policy
其中client.policy要保证允许客户端访问http服务,默认情况下,http用80断口,所以,你的client.policy一般可以这样写
grant
{ permission java.net.SocketPermission
"*:1024-65535", "connect,accept";
permission java.net.SocketPermission
"*:80", "connect,accept";
};
4。 然后开一个dos窗口,键入set classpath=回车,这时你的CLASSPATH被清空,防止混乱
例如
C:>set classpath=
C:>set classpath
Environment variable classpath not defined
C:>rmiregistry
5。 然后再server目录里启动服务端:
E:Server>java -Djava.rmi.server.codebase=http://localhost/download/ ProductServer
Constructing server implementations...
Binding server implementations to registry...
Waiting for invocations from clients...
6。 然后再client目录里启动客户端
E:Client>java -Djava.security.policy=client.policy ProductClient
I am a Blackwell Toaster. Buy me!
I am a ZapXpress Microwave Oven. Buy me!
结束
|
没有找到stub,首先确定启动rmiregistry不包括任何类路径,让后建议把stub,skel的文件放在可以让客户端方便访问的地方,强烈推荐http目录内,启动server端一定要保证需要的接口,和实现接口的远程对象的类放在classpath内,再加上正确的java.rmi.server.codebase参数,和policy文件就可正常启动服务端了...
|
http目录就是你的web服务的文件的目录,你第一次启动web服务的时候会设置这个路径的(或者是系统缺省路径).