RMI的一个简单测试疑惑

tg008007x3 2010-06-08 10:05:35
定义了一个remote接口
public interface HelloService extends Remote {
//服务器端定义的服务接口
public abstract String echo(String msg) throws RemoteException;
public abstract Date getTime() throws RemoteException;
}
//下面是服务器端的程序,其中HelloServiceImpl1 ,HelloServiceImpl2 是二个HelloService的实现类且都继承了//UnicastRemoteObject类。
public class SimpleServer {
/**
* @param args
*/
public static void main(String[] args) throws RemoteException{
// TODO Auto-generated method stub
try {
HelloServiceImpl1 helloService1=new HelloServiceImpl1();
HelloServiceImpl2 helloService2=new HelloServiceImpl2();
Context namingContext=new InitialContext(System.getProperties());
namingContext.rebind("rmi://localhost:8000/helloService1", helloService1);
namingContext.rebind("rmi://localhost:8000/helloService2", helloService2);
System.out.println("服务器注册了2个HelloService对象");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}

}

运行完毕后出现异常:
javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: Exception creating connection to: localhost; nested exception is:
java.net.SocketException: Network is unreachable: connect]
...全文
109 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tg008007x3 2010-06-08
  • 打赏
  • 举报
回复
楼上说书滴?
East271536394 2010-06-08
  • 打赏
  • 举报
回复
编程

  我们将首先编写远程对象,并将代码保存为名字为AddServer.Java的文件:


import Java.rmi.*;

public interface AddServer extends Remote {

public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException;

}


  我们来看看上面的代码。首先,为了使用其内容,我们导入rmi包。然后,我们创建一个扩展了Java.rmi中远程接口的接口。所有的远程对象必须扩展该远程接口,我们将该远程接口称为AddServer。在该远程对象中,有一个名字为AddNumbers的方法,客户端可以调用这一方法。我们必须记住的是,所有的远程方法都需要启动RemoteException方法,有错误发生时就会调用该方法。

  下面我们开始编写远程对象的实现。这是一个实现远程对象并包含有所有方法代码的类,将下面的代码保存为名字为AddServerImpl.Java的文件:


import Java.rmi.*;

public class AddServerImpl extends UnicastRemoteObject implements AddServer {
public AddServerImpl() {
super();
}
public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException {
return firstnumber + secondnumber;
}
}

  首先,我们导入rmi包,然后创建一个扩展UnicastRemoteObject和实现创建的远程对象的类;其次,我们可以为类创建一个缺省的构建器。我们还了解了AddNumbers方法的代码,它启动RemoteException。这样我们就覆盖了创建的远程对象中的方法。AddNumbers方法的代码非常好理解,它接受2个整型参数,然后相加并返回它们的和。

  至此,我们已经有了二个Java文件:远程对象和远程对象的实现。下面我们将使用Javac命令编译这二个文件:

  编译远程对象:


C:\jdk\bin\Javac workingdir\AddServer.Java

  编译远程对象实现:


C:\jdk\bin\Javac workingdir\AddServerImpl.Java

  这样,就会达到二个Java文件和二个类文件,下面我们将创建stub和skeleton。为了创建stub和skeleton文件,我们必须使用rmic编译器编译远程对象实现文件。

  用Rmic编译远程对象实现文件:


C:\jdk\bin\rmic workingdir\AddServerImpl.Java

  然后,我们就会发现多了2个新建的类文件,它们分别是AddServerImpl_Stub.class 和AddServerImpl_Skel.class 。

  The Coding (Contd.)

  我们已经编译了所有的源代码,下面我们来创建客户端和服务器端,将下面的代码保存为名字为RmiServer.Java的文件:


import Java.rmi.*;
import Java.net.*;

public class RmiServer {
public static void main (String args[]) throws RemoteException, MalformedURLException {
AddServerImpl add = new AddServerImpl();
Naming.rebind("addnumbers",add);
}
}


  首先,我们导入Java.rmi包和Java.net包。另外,我们还使用throws从句捕获任何异常。我们从对象中得出远程对象实现,使用rebind方法将字符串addnumbers与该对象绑定。下面的例子显示了绑定的含义:
从现在开始,无论何时客户端要调用远程对象,使用字符串addnumbers就可以实现。rebind方法有二个参数:第一个参数是字符串变量,第二个参数是远程对象实现类的对象。

  下面我们来创建客户端,将下面的代码保存为名字为RmiClient.Java的文件:


import Java.rmi.*;
import Java.net.*;

public class RmiClient {
public static void main(String args[]) throws RemoteException, MalformedURLException {
String url="rmi://127.0.0.1/addnumbers";
AddServer add;
add = (AddServer)Naming.lookup(url);
int result = add.AddNumbers(10,5);
System.out.println(result);
}
}


  首先,我们导入Java.rmi包和Java.net包,并使用throws从句捕获所有必要的异常。然后通过利用Naming类中的静态lookup方法从远程对象中得到一个对象。(这也是我们无需从Naming类中得到一个对象并调用它。而只使用类名字的原因。)

  lookup方法接受远程对象的完整的URL名字,该URL由完整的机器IP地址以及与对象绑定的字符串(也誻对象的绑定名)组成。在调用远程对象时,我们使用了RMI协议。lookup方法向我们返回一个对象,在能够使用它前,我们必须将它的数据类型转换为与远程对象的数据类型一致。


Since we have both our server and client source ready, let's compile them both:

  至此,我们已经有了服务器端和客户端的源代码,下面我们来编译这二个源文件:

  编译远程服务器:


C:\jdk\bin\Javac workingdir\RmiServer.Java

  编译远程客户端:


C:\jdk\bin\Javac workingdir\RmiClient.Java

  在对我们的代码进行测试前,还必须首先启动RMI Registry。RMI Registry存储有所有绑定的数据,没有它,RMI就不能正常地运行!

  启动Rmi Registry服务器:


C:\jdk\bin\start rmiregistry

  我们会注意到,这时会出现一个空白的DOS提示符窗口,这表明Rmi Registry服务器在运行,注意不要关闭该窗口。然后,我们首先在一个DOS提示符窗口中运行Rmi服务器,然后在另一个DOS提示符窗口中运行Rmi客户端。

  启动RMI服务器:

C:\jdk\bin\Java workingdir\RmiServer

  启动RMI客户端:


C:\jdk\bin\Java workingdir\RmiClient

  如果一切正常,我们应该能够得到15这个输出。我们向AddNumbers方法输入10和5二个数字,该方法将这二者加起来,并将其和15返回给我们。如果得到了15这个输出,说明我们已经成功地执行了一个远程方法。当然,在这里,我们并没有执行真正意义上的远程方法,因为我们的计算机既是服务器,又是客户机。如果有计算机网络,我们就可以方便地进行执行远程方法的试验了。


81,092

社区成员

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

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