当前位置:首页 » 城管服务 » rmi服务

rmi服务

发布时间: 2021-01-26 03:24:30

A. java RMI客户端也要实现服务端的接口吗

两边是通过接口来交换信息的,当然都需要接口和它的 Stub。


你做实验时可以考虑创建3个项目:

1、接口项目,只包括接口和接口编译后的 Stub 类

2、服务端项目,只包括服务器类,它依赖接口项目。

3、客户端项目,只包括客户端,它依赖接口项目。


如果是从命令行运行它们,那么服务端需要服务端项目和接口项目两个 jar,客户端需要客户端项目和接口项目两个 jar,我们需要面向接口编程减少耦合程度,不要把所有类全部放在同一个项目中编译,将来会碰到很多麻烦事,比如包名太多就可能不支持 OSGi 这种方式。


在远程调用类的应用中,使用静态方法调用时一般需要接口类对应的Stub,我们 lookup 得到的其实是 Stub (它只包括了连接到服务器的参数,然后把你想调用的”服务“ + ”参数“ 发送给服务器并将从服务器返回的结果返回给客户端程序,因此,它其实并没有什么”针对你的程序和服务器的特殊特性),使用动态的调用方式就完全可以做到不需要特定的 Stub 而用一个通用的方式 (也就是 RMI 编译生成的那个 Stub 类的内容我们来自己写成一个框架。


上面一段是废话,来说说怎么配置环境测试它们。

客户端项目中只需要有接口 TestServer 和 TestServerStub 两个类,如果你的参数本身也是一个 Remote 子类,那么参数类也需要有相应的 Stub。


另外,我们客户端也可以仅自带接口类而不自带Stub,在运行的时候可以”请求从服务器上下载一份 Stub",如下:

System.setSecurityManager(newRMISecurityManager());

然后在命令行添加额外参数:
-Djava.security.policy=$policy文件
-Djava.rmi.server.codebase=file:///C:/service-interface/classes/

这样就可以启用RMIClassLoader来自动从codebase对应的地方查找Stub类,这里面codebase可以是一个Http或Ftp协议,注意这个codebaseURL后面一个/是必须的。那个$policy文件可以用JDKinpolicytool.exe来生成一个。

B. webService和RMI的区别

RMI的客户端和服务端都必须是java,webservice没有这个限制。
webservice是在http协议上传内递xml文本文容件,与语言和平台无关。
RMI是在tcp协议上传递可序列化的java对象,只能用在java虚拟机上,绑定语言
RMI是EJB远程调用的基础,仅用RMI技术就可以实现远程调用,使用EJB是为了实现组件,事物,资源池,集群等功能。
WebService是通过XML来传输数据,可用http等协议因此可在异构系统间传递,并且可以穿过防火墙,可在公网上远程调用

C. Java Rmi如何实现两个客户端之间的通信 求说的具体点

RMI的开发步骤

先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote

开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承UnicastRemoteObject

通过javac命令编译文件,通过java -server 命令注册服务,启动远程对象

最后客户端查找远程对象,并调用远程方法

首先为服务建立一个Model层,注意因为此对象需要现实进行远程传输,所以必须继承Serializable

代码

packagermi.model;

importjava.io.Serializable;

//注意对象必须继承Serializable
{
privateintid;
privateStringname;
privateintage;

publicvoidsetId(intid){
this.id=id;
}

publicintgetId(){
returnid;
}

publicvoidsetName(Stringname){
this.name=name;
}

publicStringgetName(){
returnname;
}

publicvoidsetAge(intage){
this.age=age;
}

publicintgetAge(){
returnage;
}
}

创建远程接口PersonService,注意远程接口需要继承Remote

代码

packagermi.service;

importjava.rmi.Remote;
importjava.rmi.RemoteException;
importjava.util.List;
importrmi.model.*;

//此为远程对象调用的接口,必须继承Remote类
{
publicList<PersonEntity>GetList()throwsRemoteException;
}

建立PersonServiceImpl实现远程接口,注意此为远程对象实现类,需要继承UnicastRemoteObject

代码

packagermi.serviceImpl;

importjava.rmi.RemoteException;
importjava.rmi.server.UnicastRemoteObject;
importjava.util.LinkedList;
importjava.util.List;

importrmi.model.PersonEntity;
importrmi.service.*;

//此为远程对象的实现类,须继承UnicastRemoteObject
Service{

publicPersonServiceImpl()throwsRemoteException{
super();
//TODOAuto-generatedconstructorstub
}

@Override
publicList<PersonEntity>GetList()throwsRemoteException{
//TODOAuto-generatedmethodstub
System.out.println("GetPersonStart!");
List<PersonEntity>personList=newLinkedList<PersonEntity>();

PersonEntityperson1=newPersonEntity();
person1.setAge(25);
person1.setId(0);
person1.setName("Leslie");
personList.add(person1);

PersonEntityperson2=newPersonEntity();
person2.setAge(25);
person2.setId(1);
person2.setName("Rose");
personList.add(person2);

returnpersonList;
}
}

建立服务器端,在服务器端注册RMI通讯端口与通讯路径,然后通讯javac命令编译文件,通过java -server 命令注册服务。以下面代码为例,如果阁下将项目建立于D:\RMIRemotingService文件夹上时,则先输入D:\RMIRemotingServicesrc>javac rmi/remotingservice/Program.java获取Program.class(如何阁下使用的MyEclipse等开发工具,可跳过此步,直接在*/bin文件夹中直接调用已经生成的Program.class),然后输入D:\RMIRemotingServicesrc>java rmi/remotingservice/Program启动服务。

代码

packagermi.remotingservice;

importjava.rmi.Naming;
importjava.rmi.registry.LocateRegistry;

importrmi.service.*;
importrmi.serviceImpl.*;

publicclassProgram{

publicstaticvoidmain(String[]args){
try{
PersonServicepersonService=newPersonServiceImpl();
//注册通讯端口
LocateRegistry.createRegistry(6600);
//注册通讯路径
Naming.rebind("rmi://127.0.0.1:6600/PersonService",personService);
System.out.println("ServiceStart!");
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}

最后建立客户端进行测试,注意客户调用的RMI路径必须服务器配置一致

代码

packagermi.remotingclient;

importjava.rmi.Naming;
importjava.util.List;

importrmi.model.PersonEntity;
importrmi.service.*;

publicclassProgram{
publicstaticvoidmain(String[]args){
try{
//调用远程对象,注意RMI路径与接口必须与服务器配置一致
PersonServicepersonService=(PersonService)Naming.lookup("rmi://127.0.0.1:6600/PersonService");
List<PersonEntity>personList=personService.GetList();
for(PersonEntityperson:personList){
System.out.println("ID:"+person.getId()+"Age:"+person.getAge()+"Name:"+person.getName());
}
}catch(Exceptionex){
ex.printStackTrace();
}
}
}

常见错误

在命令提示符调用java命令时,显示并无此命令。这是因为未在“环境变量”中绑定JAVA的JDK命令造成的,你首先单击“计算机右键”->“属性”->“高级”->“环境变量”。在系统变量Path设置中加载为JDK的路径 .;D:Program FilesGenuitecCommoninarycom.sun.java.jdk.win32.x86_1.6.0.013in。然后在ClassPath加载服务器端的Program.class地址 .;D:\RMIRemotingServicein

在调用javac命令时出现“javac 找不到文件 ..... ”此错误,可能是因为阁下输入的文件路径出现错误造成,注意不要把D:\RMIRemotingServicesrc>javac rmi/remotingservice/Program.java写错为D:\RMIRemotingServicesrc>javac rmi.remotingservice.Program.java

在调用D:\RMIRemotingServicein>java rmi/remotingservice/Program命令时出现“Exception in thread 'main' java.lang.NoClassEdfoundError”错误,第一这可能是阁下把Program错写为Program.class,注意java命令不需要加后缀名。第二可能是阁下把“java rmi/remotingservice/Program”错写为“java rmi emotingserviceProgram"。

D. 请教个问题基于RPC,RMI等远程调用服务的事务怎么保证强一致性要求。JTA能做到吗

传感器来是一种检测装源置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。
传感器的特点包括:微型化、数字化、智能化、多功能化、系统化、网络化。它是实现自动检测和自动控制的首要环节。传感器的存在和发展,让物体有了触觉、味觉和嗅觉等感官,让物体慢慢变得活了起来。通常根据其基本感知功能分为热敏元件、光敏元件、气敏元件、力敏元件、磁敏元件、湿敏元件、声敏元件、放射线敏感元件、色敏元件和味敏元件等十大类。

E. java rmi怎样实现服务器间的通信

有几个建议
1:主服务器不用主动发IP给子服务器(主服务器不可能知道子服务器的数目),也没有必要主服务来发,完全可以让子服务器来主动向主服务索取IP。
2:结果完全没有必要以文件形式存放(每次开机要重新获得,没有必要做持久化),完全可以存到一个Set中。

根据以上:我做一个简单的实现:
***********************************************
IHost.java

package test.rmi.host;

import java.rmi.RemoteException;
/**
* remote interface
*
*/
public interface IHost extends java.rmi.Remote
{
void register(String ip) throws RemoteException;

String[] getAllSubServerList() throws RemoteException;

}

***********************************************
Host.java

package test.rmi.host.impl;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashSet;
import java.util.Set;

import test.rmi.host.IHost;

/**
*
* the implentation class of Ihost
*
*/
public class Host extends UnicastRemoteObject implements IHost
{
private static final long serialVersionUID = -2197983171132594422L;

private Set<String> subServers = new HashSet<String>();

public Host() throws RemoteException
{
super();
}

public String[] getAllSubServerList() throws RemoteException
{
String[] ips = new String[] {};
synchronized (this)
{
ips = subServers.toArray(ips);
}
return ips;
}

public void register(String ip) throws RemoteException
{
synchronized (this)
{
subServers.add(ip);
}
}
}
***********************************************
ServiceStartup.java

package test.rmi.host;

import java.rmi.Naming;

import test.rmi.host.impl.Host;

/**
* The main class for Host server,mainly for start up the host
*
*/
public class ServiceStartup
{
public static void main(String args[]) throws Exception
{

Host host = new Host();
Naming.rebind("HostServer", host);
}

}
***********************************************
SubServerStartup.java

package test.rmi.sub;

import java.net.InetAddress;
import java.rmi.Naming;

import test.rmi.host.IHost;

/**
* The main class for Sub server,mainly for start up the sub
*
*/
public class SubServerStartup
{
public static void main(String args[]) throws Exception
{
String hostIp = "";
IHost host = (IHost) Naming.lookup("rmi://" + hostIp + "/HostServer");
String myIp = InetAddress.getLocalHost().toString();
host.register(myIp);

//do something...
try{
//wait for other sub server start up
Thread.sleep(3000);
}catch(Exception e){}

String[] allSubServer = host.getAllSubServerList();
//do something...
}
}
***********************************************

本实现只是提供一个简单的思路和基本的技术实现,希望可以帮助到你
以上代码已经可以运行了,你说的具体点,是哪方面?是如何运行rmi程序吗?

F. 在java RMI服务器端是否可以写多个接口,从而注册多个不同的远程对象呢

你想实现几个接口都是可以的,只要符合远程接口的规范
类似下面的代码这样写啊
远程接口实例
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote
{
String sayHello() throws RemoteException;
}
它定义了一个方法,sayHello,实现向调用者返回一个字符串

Server类
import java.rmi.registry.Resistry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Server implements Hello
{
public Server(){}
public String sayHello()
{
return “Hello,World!”;
}
public static void main(String args[])
{
Try{
Server obj=new Server ();
Hello stub=(Hello)UnicastRemoteObject.explortObject(obj,0);
//Bind the remote object’ s stub in the registry
Registry registry=LocateRegistry.getRegistry();
Registry.bind(“Hello”,stub);
System.err.println(“Server ready”);
}catch(Exception e)
{
System.err.println(“Server exception:”+e.toString());
e.printStackTrace();
}
}
}

G. rmi服务怎么关闭

Namimg.unbind()不行吗?
javadoc如下:
static void unbind(String name) 销毁与远程对象关联的指定名称的绑定。

而且楼主你为什么要关内闭RMI服务呢?把服务器关掉容RMI不就停止了吗?

H. JavaRMI服务远程方法调用漏洞如何修复lin

Linux的Apache或WebLogic应用被检测出这个漏洞,NSFOCUS(绿盟)给出的解决办法是:

临时解决方法:【限制访问或删除类文件】

如果您不能立刻安装补丁或者升级,建议您采取以下措施以降低威胁:

* 使用防火墙规则及文件系统访问限制

* 使用 SerialKiller 替换进行序列化操作的 ObjectInputStream 类

* 删除掉项目里的“commons-collections-3.2.jar///org/apache/commons/collections/functors/InvokerTransformer.class” 文件,删除后项目可能会在某些功能下报错。

安装厂商补丁:【下载3.2.2以上版本commons-collections补丁】

目前厂商已经发布了升级补丁ACC 3.2.2 以修复这个安全问题,请到厂商的主页下载:

Download Commons Collections

http://svn.apache.org/viewvc?view=revision&revision=1713307

https://blogs.apache.org/foundation/entry/apache_commons_statement_to_widespread

I. java RMI如何停止服务器。

为了以编程方式启动RMI注册,你可以使用LocateRegistry.createRegistry(int port)方法。该方法返回类型注册的一个对象。当我们想在应用程序一端终止这个注册时,我们保存这个参考。就在我们启动我们的在JMXAgent.start()中的JMXConnectorServer之前,我们首先启动RMI注册,使用下列代码行:

registry = LocateRegistry.createRegistry(Constants.RMI_REGISTRY_PORT);

在应用程序一端,在JMXAgent.stop()中停止JMXConnectorServer之后,调用下列方法来终止该注册:

UnicastRemoteObject.unexportObject(registry,true);

http://www.webjx.com/htmldata/2006-03-27/1143443474.html

热点内容
影视转载限制分钟 发布:2024-08-19 09:13:14 浏览:319
韩国电影伤口上纹身找心里辅导 发布:2024-08-19 09:07:27 浏览:156
韩国电影集合3小时 发布:2024-08-19 08:36:11 浏览:783
有母乳场景的电影 发布:2024-08-19 08:32:55 浏览:451
我准备再看一场电影英语 发布:2024-08-19 08:14:08 浏览:996
奥迪a8电影叫什么三个女救人 发布:2024-08-19 07:56:14 浏览:513
邱淑芬风月片全部 发布:2024-08-19 07:53:22 浏览:341
善良妈妈的朋友李采潭 发布:2024-08-19 07:33:09 浏览:760
哪里还可以看查理九世 发布:2024-08-19 07:29:07 浏览:143
看电影需要多少帧数 发布:2024-08-19 07:23:14 浏览:121