「javarmi端口」java获取项目端口号

博主:adminadmin 2022-11-23 14:14:06 61

本篇文章给大家谈谈javarmi端口,以及java获取项目端口号对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何在 Java 程序中释放 RMI 端口

rmiregistry的默认端口是1099....你这里指定的端口是3000 所以你在CMD中要这样 start rmiregistry 3000 或者将你的Naming.bind("/localhost:3000/getStudent", obj); 改为Naming.bind("rmi://localhost:1099/getStudent", obj); 额,突然发现你没...

哪些端口是通过java RMI连接使用

RMI的优势

这种机制给分布计算的系统设计、编程都带来了极大的方便。只要按照RMI规则设计程序,可以不必再过问在RMI之下的网络细节了,如:TCP和Socket等等。任意两台计算机之间的通讯完全由RMI负责。调用远程计算机上的对象就像本地对象一样方便。 

1、面向对象: 

RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。也就是说,可以将类似Java Hash表这样的复杂类型作为一个参数进行传递。

2、可移动属性: 

RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。

3、设计方式: 

对象传递功能使你可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。如果用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象——包括实现和类型——就会失去设计方式上所提供的优点。

4、安全性: 

RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。

5、便于编写和使用 

RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。远程接口实际上就是Java接口。为了实现RMI的功能必须创建远程对象任何可以被远程调用的对象必须实现远程接口。但远程接口本身并不包含任何方法。因而需要创建一个新的接口来扩展远程接口。新接口将包含所有可以远程调用的方法。远程对象必须实现这个新接口,由于新的接口扩展了远程接口,实现了新接口,就满足了远程对象对实现远程接口的要求,所实现的每个对象都将作为远程对象引用。 

一个国外的PPT上还还总结到: 

Java RMI Advantages: 

Full object support 

Cross platform. capabilities 

Robust communications 

Large objects 

Security for client and servers 

Distribution/updates of codes

RMI的劣势

从上面的过程来看,RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。

RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。 

一个国外的PPT上也总结到: 

Java RMI Disadvantages: 

Java RMI only supports Java 

Proprietary protocol by single vendor 

Requires RMI-lookup 

Requires non-standard port

RMI与Socket的比较

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.Remote;

import java.rmi.RemoteException;

/*

* 这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象

* 我们可供远程调用的方法就是通过这里开公开

*/ public interface IRMI extends Remote{

public String invoke() throws RemoteException;

} 12345678910

第二步:创建接口的具体实现类

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 {  //该方法公开

return "hello,world!";

}

public String tryInvoke() throws RemoteException{ //该方法未公开,若要公开请在接口中定义

return "try to remote me";

}

} 1234567891011121314151617181920212223

第三步:创建RMI服务器

import java.rmi.Naming;

import java.rmi.registry.LocateRegistry;

import java.rmi.registry.Registry;

/*

* 远程对象的注册类 该类应该在服务器端执行,执行之后

* 该机器将变为RMI服务器 客户端可以通过正确的url来访问

* 服务器上的远程对象,执行对外报露的方法

*/ public class RMIServer {

static int port = 8888;

/*

* 创建一个Registry对象.

* LocateRegistry用于获取名字服务或创建名字服务.

* 调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry

* @return 返回一个Registry对象

*/

private static Registry createRegistry() {

Registry registry = null;

try {

registry = LocateRegistry.getRegistry(port); //如果该端口未被注册,则抛异常

registry.list(); //拿到该端口注册的rmi对象

} catch (final Exception e) {

try {

registry = LocateRegistry.createRegistry(port);//捕获异常,端口注册

} catch (final Exception ee) {

ee.printStackTrace();

}

}

return registry;

}

/**

* 将对象注册到rmi服务器上

*/

public static void bind() {

Registry registry =  createRegistry();

try {

IRMIImpl impl = new IRMIImpl();

registry.rebind("mytask", impl); //这就是绑定,client里lookup必须和"mytast"一样才能远程调用impl

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

try {

bind();

} catch (Exception e) {

e.printStackTrace();

}

}

} 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455

上面是一种比较好的写法,如果只是要测试,可以直接在main()方法中写:

ImplementClass ic = new ImplementClass(); //具体实现类

Registry r = LocateRegistry.createRegistry(8888);

r.bind("mytask", ic);

//Naming.rebind("rmi://localhost:8888/mytask", ic); 可替换上句 1234

1.注册一个端口 2.在注册端口绑定taskName和implementClass 3.客户端就可以通过url和taskName来找到implementClass。

第四步:创建RMI客户端

import java.rmi.Naming;

public class RMIClient {

/**

* 调用远程对象中的方法

* @throws Exception

*/

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) {

try {

getRemoteObject();

} catch (Exception e) {

e.printStackTrace();

}

}

} 123456789101112131415161718192021222324

运行RMI系统:启动RMI服务器,启动客户端即可。

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

RMI的开发步骤

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

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

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

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

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

代码 

package rmi.model;

import java.io.Serializable;

//注意对象必须继承Serializable

publicclass PersonEntity implements Serializable {

    privateint id;

    private String name;

    privateint age;

    publicvoid setId(int id) {

        this.id = id;

    }

    publicint getId() {

        return id;

    }

    publicvoid setName(String name) {

        this.name = name;

    }

    public String getName() {

        return name;

    }

    publicvoid setAge(int age) {

        this.age = age;

    }

    publicint getAge() {

        return age;

    }

}

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

代码

package rmi.service;

import java.rmi.Remote;

import java.rmi.RemoteException;

import java.util.List;

import rmi.model.*;

//此为远程对象调用的接口,必须继承Remote类

publicinterface PersonService extends Remote {

    public ListPersonEntity GetList() throws RemoteException;

}

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

代码

package rmi.serviceImpl;

import java.rmi.RemoteException;

import java.rmi.server.UnicastRemoteObject;

import java.util.LinkedList;

import java.util.List;

import rmi.model.PersonEntity;

import rmi.service.*;

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

publicclass PersonServiceImpl extends UnicastRemoteObject implements PersonService {

    public PersonServiceImpl() throws RemoteException {

        super();

        // TODO Auto-generated constructor stub

    }

    @Override

    public ListPersonEntity GetList() throws RemoteException {

        // TODO Auto-generated method stub

        System.out.println("Get Person Start!");

        ListPersonEntity personList=new LinkedListPersonEntity();

        

        PersonEntity person1=new PersonEntity();

        person1.setAge(25);

        person1.setId(0);

        person1.setName("Leslie");

        personList.add(person1);

        

        PersonEntity person2=new PersonEntity();

        person2.setAge(25);

        person2.setId(1);

        person2.setName("Rose");

        personList.add(person2);

        

        return personList;

    }    

}

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

代码

package rmi.remotingservice;

import java.rmi.Naming;

import java.rmi.registry.LocateRegistry;

 

import rmi.service.*;

import rmi.serviceImpl.*;

publicclass Program{

    publicstaticvoid main(String[] args) {

        try {

            PersonService personService=new PersonServiceImpl();

            //注册通讯端口

            LocateRegistry.createRegistry(6600);

            //注册通讯路径

            Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService);

            System.out.println("Service Start!");

        } catch (Exception e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

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

代码 

package rmi.remotingclient;

import java.rmi.Naming;

import java.util.List;

import rmi.model.PersonEntity;

import rmi.service.*;

publicclass Program {

    publicstaticvoid main(String[] args){

        try{

            //调用远程对象,注意RMI路径与接口必须与服务器配置一致

            PersonService personService=(PersonService)Naming.lookup("rmi://127.0.0.1:6600/PersonService");

            ListPersonEntity personList=personService.GetList();

            for(PersonEntity person:personList){

                System.out.println("ID:"+person.getId()+" Age:"+person.getAge()+" Name:"+person.getName());

            }

        }catch(Exception ex){

            ex.printStackTrace();

        }

    }

}

常见错误

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

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

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

java RMI问题

rmiregistry的默认端口是1099....你这里指定的端口是3000

所以你在CMD中要这样 start rmiregistry 3000

或者将你的Naming.bind("/localhost:3000/getStudent", obj);

改为Naming.bind("rmi://localhost:1099/getStudent", obj);

额,突然发现你没有在前面加rmi前缀...不知道这个有关系没~~~~

额,查了下,不加rmi前缀也可以,加了rmi前缀后会如果你没有指定端口就会将obj注册到主机上监听1099端口的rmiregistry进程上去...

如果还出现错误就不知道了

javarmi端口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java获取项目端口号、javarmi端口的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-23,除非注明,否则均为首码项目网原创文章,转载请注明出处。