|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
恰恰证明了java的简单,要不怎么没有通过c/c++来搞个这种框架?RMI从Java1.1入手下手,RMI使得运转于分歧JVM(包含分歧主机)上的Java使用程序能够相互通话。
即:一个JVM中的Java使用程序能够挪用另外一JVM上的对象(远程对象)所界说的办法。
JavaRMI有侧重要的意义。RMI在Java收集编程和初级编程中都有主要的使用,如EJB,Jini等。
Java2对RMI做了良多加强和改善,如平安性,静态代码下载等。
本文给出了一个最复杂的例子,以申明个中的一些基础道理。本文的特性是注意了实践开辟和真实的运转
情况相分离,摹拟了RMI真实的开辟和运转历程。
1.完成远程接口,天生远程对象,存根(Stub)和框架(Skeleton)
完成远程接口,远程接口告知JVM:完成了该接口的对象能够远程挪用及有哪些办法能够挪用。
本例子中界说了sayHello()。因为远程挪用会触及到收集通信,因而这些办法都要抛出RemoteException.
远程接口和远程对象能够由A开辟,并把远程接口(Hello)d打包分给Client端开辟者B。
创建f:server目次,把Hello.java和HelloImpl.java拷贝到该目次中。
//Hello.java
packagejdeveloper.rmi;
importjava.rmi.Remote;
importjava.rmi.RemoteException;
publicinterfaceHelloextendsRemote{
StringsayHello()throwsRemoteException;
}
天生远程对象.
//HelloImpl.java
packagejdeveloper.rmi;
importjava.rmi.Naming;
importjava.rmi.RemoteException;
importjava.rmi.RMISecurityManager;
importjava.rmi.server.UnicastRemoteObject;
publicclassHelloImplextendsUnicastRemoteObject
implementsHello{
publicHelloImpl()throwsRemoteException{
super();
}
publicStringsayHello(){
return"HelloWorld!";
}
publicstaticvoidmain(Stringargs[]){
//Createandinstallasecuritymanager
if(System.getSecurityManager()==null){
System.setSecurityManager(newRMISecurityManager());
}
try{
Helloobj=newHelloImpl();
//Bindthisobjectinstancetothename"HelloServer"
Naming.rebind("HelloServer",obj);
System.out.println("HelloServerboundinregistry");
}catch(Exceptione){
System.out.println("HelloImplerr:"+e.getMessage());
e.printStackTrace();
}
}
}
存根(Stub)和框架(Skeleton)
f:
cdserver
javac-d.Hello.java
javac-d.HelloImpl.java
rmic-d.jdeveloper.rmi.HelloImpl
jarcvfhello.jarjdevelopermiHello.class把hello.jar分发给Client真个开辟者B。
存根(Stub)的寄存!
存根(Stub)是静态下载的。Client经由过程存根(Stub)和远程对象的框架(Skeleton)通信,对Client来
讲就象操纵当地对象一样。在年夜多半情形下,可下载的代码放到http服务器的某个目次中。本例子放到http://hjc/rmi下。
hjc:呆板名,rmi:http的一个目次。假如只是单机测试则能够放到某个目次下如f:serverclasses.
本文将对以上两种办法都给出运转的步骤(policy文件和bat文件)。
2.完成Client端程序
//HelloClient.java
packagejdeveloper.rmi;
importjava.rmi.RMISecurityManager;
importjava.rmi.Naming;
importjava.rmi.RemoteException;
importjava.rmi.NotBoundException;
publicclassHelloClient{
publicstaticvoidmain(Stringargs[])throwsException{
System.setSecurityManager(newRMISecurityManager());
HelloRemoteObj=(Hello)Naming.lookup("//"+args[0]+"/HelloServer");
System.out.println(RemoteObj.sayHello());
}
}
创建f:client目次,把HelloClient.java拷贝到该目次中。
创建f:clientclasses目次,把hello.jar拷贝到该目次中。
f:
cdclient
javac-classpath%CLASSPATH%;f:clientclasseshello.jar-d.HelloClient.java
3.运转程序
启动DOS窗口
setclasspath=
startrmiregistry
A.以单机体例运转
创建f:serverclassesjdevelopermi目次
f:
cdf:serverclasses
copyf:serverhello.jar.
copyf:serverjdevelopermiHelloImpl_Stub.classf:serverclassesjdevelopermi
jarxvfhello.jar
启动新的DOS窗口
把starthelloserver.bat和rmiserver.policy放到f:server
运转starthelloserver
starthelloserver.bat
SETCP=f:server;f:serverclasseshello.jar
echousingclasspath:%CP%
java-classpath%CP%-Djava.rmi.server.codebase=file:/f:serverclasses/
-Djava.rmi.server.hostname=hjc-Djava.security.policy=rmiserver.policyjdeveloper.rmi.HelloImpl
rmiserver.policy
grant{
permissionjava.net.SocketPermission"*:1024-65535",
"connect";
};
启动新的DOS窗口
把starthelloclient.bat和rmiclient.policy放到f:client
运转starthelloclient
starthelloclient.bat
@echooff
setCP=f:client;f:clientclasseshello.jar
echousingclasspath%CP%
@echoon
java-classpath%CP%-Djava.rmi.server.codebase=file:/f:serverclasses/
-Djava.security.policy=rmiclient.policyjdeveloper.rmi.HelloClient%1
rmiclient.policy
grant{
permissionjava.net.SocketPermission"*:1024-65535",
"connect";
permissionjava.io.FilePermission
"f:serverclasses-","read";
};
B.以收集体例运转
创建apache_pathhtdocsmijdevelopermi目次
cdapache_pathhtdocsmi
copyf:serverhello.jar.
copyf:serverjdevelopermiHelloImpl_Stub.classapache_pathhtdocsmijdevelopermi
jarxvfhello.jar
把starthellohttpserver.bat和rmihttpserver.policy放到f:server
启动新的DOS窗口
运转starthellohttpserver
starthellohttpserver.bat
SETCP=f:server;f:serverclasseshello.jar
echousingclasspath:%CP%
java-classpath%CP%-Djava.rmi.server.codebase=http://hjc/rmi/
-Djava.security.policy=rmihttpserver.policyjdeveloper.rmi.HelloImpl
rmihttpserver.policy
grant{
permissionjava.net.SocketPermission"*:1099","accept,connect,listen,resolve";
permissionjava.net.SocketPermission"*:80","accept,connect,listen,resolve";
};
启动新的DOS窗口
把starthellohttpclient.bat和rmihttpclient.policy放到f:client
运转starthellohttpclient
starthellohttpclient.bat
@echooff
setCP=f:client;f:clientclasseshello.jar
echousingclasspath%CP%
@echoon
java-classpath%CP%-Djava.rmi.server.codebase=http://hjc/rmi/
-Djava.security.policy=rmihttpclient.policyjdeveloper.rmi.HelloClient%1
rmihttpclient.policy
grant{
permissionjava.net.SocketPermission"*:80","connect";
permissionjava.net.SocketPermission"*:1024-65535","connect";
};
J2ME在手机游戏开发的作用也是无用质疑的。至于桌面程序,可能有人说java不行,界面不好看,但是请看看NetBeans和Eclipse吧,他们都是利用java开发的,而他们的界面是多么的华丽,所以界面决不是java的缺点。还有一个不得不提的优点就是大多java人员都挂在嘴边的java的跨平台性,目前这确实也是java优点之一。 |
|