哪些端口是通过java RMI连接使用
发布时间:2025-05-21 16:15:22 发布人:远客网络
一、哪些端口是通过java RMI连接使用
这种机制给分布计算的系统设计、编程都带来了极大的方便。只要按照RMI规则设计程序,可以不必再过问在RMI之下的网络细节了,如:TCP和Socket等等。任意两台计算机之间的通讯完全由RMI负责。调用远程计算机上的对象就像本地对象一样方便。
RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。也就是说,可以将类似Java Hash表这样的复杂类型作为一个参数进行传递。
RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。
对象传递功能使你可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。如果用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象——包括实现和类型——就会失去设计方式上所提供的优点。
RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。远程接口实际上就是Java接口。为了实现RMI的功能必须创建远程对象任何可以被远程调用的对象必须实现远程接口。但远程接口本身并不包含任何方法。因而需要创建一个新的接口来扩展远程接口。新接口将包含所有可以远程调用的方法。远程对象必须实现这个新接口,由于新的接口扩展了远程接口,实现了新接口,就满足了远程对象对实现远程接口的要求,所实现的每个对象都将作为远程对象引用。
Security for client and servers
从上面的过程来看,RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。
RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。
Proprietary protocol by single vendor
RMI技术比较socket的网络编程主要有以下几个方面:
第一、RMI是面向对象的,而后者不是。
第二、RMI是与语言相绑定的。比如当你使用Java RMI技术的时候,客户端与服务器端都必须使用Java开发。而socket的网络编程是使用独立于开发语言的,甚至独立于平台。基于socket的网络编程,客户端与服务器端可以使用不同开发语言和不同的平台。
第三、从网络协议栈的观点来看,RMI与socket的网络编程处于不同层次上。基于socket的网络编程位于TCP协议之上,而RMI在TCP协议之上,又定义了自己的应用协议,其传输层采用的是Java远程方法协议(JRMP)。可见,在网络协议栈上,基于RMI的应用位置更高一些,这也决定了,与socket的网络编程相比,RMI会丧失一些灵活性和可控性,但是好处是它带给了应用开发者更多的简洁,方便和易用。比如:如果你用的是RMI,你不需要关心消息是怎么序列化的,你只需要像本地方法调用一样,使用RMI。代价是:应用开发者无法很好地控制消息的序列化机制。
第四、这是最后一点不同,我认为也是比较重要的一点,就是两种方法的性能比较,其往往决定着你将使用那种技术来开发你的应用。
实验的结果是:RMI与TCP based socket相比,传输相同的有效数据,RMI需要占用更多的网络带宽(protocol overhead)。从这里,我们可以得出一个一般性的结论:RMI主要是用于远程方法的”调用“(RMI是多么的名符其实:)),其技术内涵强调的是“调用”,基于此,我能想到的是:移动计算,和远程控制,当你的应用不需要在client与server之间传输大量的数据时,RMI是较好的选择,它简洁、易于开发。但是,一旦你的应用需要在client与server之间传输大量的数据,极端的,比如FTP应用,则RMI是不适合的,我们应该使用 socket。
PS: RMI的效率还是很高的,一般情况下会比Hessian更高效,比Web Service更是高效很多;当然和socket这种东东相比,当然要低效一点了,socket更底层一些啊。RMI的具体实现,依然是依赖于底层的Socket编程。
一个简单的RMI系统,一般可以分成4个文件,下面来介绍各个文件的创建和作用
import java.rmi.RemoteException;
*这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象
*我们可供远程调用的方法就是通过这里开公开
*/ public interface IRMI extends Remote{
public String invoke() throws RemoteException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
*公开方法的具体实现就是这里定义的
*/ public class IRMIImpl extends UnicastRemoteObject implements IRMI{
protected IRMIImpl() throws RemoteException{
super();//这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException异常
private static final long serialVersionUID= 6131922116577454476L;
public String invoke() throws RemoteException{//该方法公开
public String tryInvoke() throws RemoteException{//该方法未公开,若要公开请在接口中定义
} 1234567891011121314151617181920212223
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
*远程对象的注册类该类应该在服务器端执行,执行之后
*该机器将变为RMI服务器客户端可以通过正确的url来访问
*服务器上的远程对象,执行对外报露的方法
* LocateRegistry用于获取名字服务或创建名字服务.
*调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry
private static Registry createRegistry(){
registry= LocateRegistry.getRegistry(port);//如果该端口未被注册,则抛异常
registry.list();//拿到该端口注册的rmi对象
registry= LocateRegistry.createRegistry(port);//捕获异常,端口注册
Registry registry= createRegistry();
IRMIImpl impl= new IRMIImpl();
registry.rebind("mytask", impl);//这就是绑定,client里lookup必须和"mytast"一样才能远程调用impl
public static void main(String[] args){
} 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
上面是一种比较好的写法,如果只是要测试,可以直接在main()方法中写:
ImplementClass ic= new ImplementClass();//具体实现类
Registry r= LocateRegistry.createRegistry(8888);
//Naming.rebind("rmi://localhost:8888/mytask", ic);可替换上句 1234
1.注册一个端口 2.在注册端口绑定taskName和implementClass 3.客户端就可以通过url和taskName来找到implementClass。
public static void getRemoteObject() throws Exception{
返回与指定 name关联的远程对象的引用(一个stub)*/
IRMI obj=(IRMI)Naming.lookup("rmi://localhost:"+RMIServer.port+"/mytask");//注:通过接口拿
System.out.println(obj.invoke());//调用远程服务的方法
public static void main(String[] args){
} 123456789101112131415161718192021222324
运行RMI系统:启动RMI服务器,启动客户端即可。
二、corba,java rmi和dcom/com的异同
1、CORBA:CORBA是Common Object Request Broker Architecture的缩写,它是分布计算机技术的发展结果,CORBA技术的成功在于,它除了能够解决由于多个系统层次上的异构带来的“孤岛”问题,还在理论和技术上扩展了客户/服务器的模式,使系统具有良好的可伸缩性,便于系统的开发与升级,保护已有投资。
2、EJB容器是一个管理一个或多个EJB类/实例的抽象。它通过规范中定义的接口使EJB类访问所需的服务。容器厂商也可以在容器或服务器中提供额外服务的接口。现在没有EJB服务器和EJB容器间接口的规范。因为目前容器通常由EJB服务器来提供,所以一旦接口标准化了,厂商就可能提供可以在任何兼容的EJB服务器上运行的容器。
3、DCOM:Microsoft的分布式COM(DCOM)扩展了组件对象模型技术(COM),使其能够支持在局域网、广域网甚至Internet上不同计算机的对象之间的通讯。使用DCOM,应用程序可以在位置上达到分布性,从而满足客户和应用的需求。
三、java和javaweb和web的区别
java-- java写的程序。(java工程)
javaweb--用java语言写的能在web容器中运行的程序(一般指j2ee)
web--则一般指纯的html语言编写的web程序。一、Java
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java
技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
Java文件格式,即各种文件夹、文件的后缀。
Java虚拟机(JVM),即处理*.class文件的解释器。
Java分为三个体系,分别为Java SE(J2SE,Java2 Platform Standard Edition,标准版),
JavaEE(J2EE,Java 2 Platform, Enterprise Edition,企业版),
Java ME(J2ME,Java 2 Platform Micro Edition,微型版)。
Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动的废料收集,使得程序员不必为内存管理而担忧。
Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java
net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。
Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。
WEB前端,对应的职位是HTML5开发工程师、WEB前端开发工程师。这种职位主要的工作内容,是将设计师制作好的PSD图制作成网页,网站当中的结构、样式、行为都是由WEB前端开发工程师完成的。
JAVA是后台语言的一种,和PHP、ASP.NET属于同类型语言。它们要做的是数据库的搭建以及将数据放置到前端制作好的网页当中。
WEB前端:具有一定的可视性,在书写一些代码后能够立即查看到相应的效果,在JavaScript方面对逻辑方面有一定的要求,一定的逻辑能力加上对细节的一丝不苟,才能够完成相应的工作内容。
JAVA:逻辑能力方面要求较高,书写的后台代码以及数据库操作,无法实时展示,较抽象,无法所做即所得、随时查看效果。
适用人群是基于两种技术特点而定
WEB前端:学习者逻辑能力一般,喜欢处理样式、制作网页特效,希望即时性的看到代码效果
JAVA:学习者逻辑能力很强,注重非可视性内容的优化,如网页加载速度、用户交互的时长等
初期入行来说,WEB前端的入行门槛要稍低于JAVA语言,根据行业特点,入行薪资也会稍有变化,2015~2017年,前端入行薪资相对较高
后期薪资两者水平基本一致,甚至JAVA薪资水平要稍高于前端。
未来职业发展过程当中,无论是从事WEB前端还是JAVA,都会向“全端”方向发展
前端走向“熟练掌握前端开发,又对后台语言有所了解”
后台走向“熟练掌握后台语言开发,并掌握基本的前端开发知识”。
WEB前端:《HTML5布局之路》《Head First JavaScript程序设计》《JavaScript权威指南》等
JAVA:《Head First JAVA》《JAVA编程思想》等