本地主机上的 RMI 连接被拒绝

Posted

技术标签:

【中文标题】本地主机上的 RMI 连接被拒绝【英文标题】:RMI connection refused on localhost 【发布时间】:2014-05-31 01:02:59 【问题描述】:

我正在尝试学习 RMI 编码,但当我运行 RMI 的服务器端时,连接被拒绝。 这是我的服务器主要方法

public static void main(String[] args)throws Exception 
Implementation impl=new Implementation();
Naming.rebind("//localhost:2020/RMI", impl);
System.out.println("Implementation has been bind to the name RMI and is ready for use");
    

我相信实现的代码并不重要,因为它只是运行代码的实现接口。我得到的例外是这个

Exception in thread "main" java.rmi.ConnectException: Connection refused to host: localhost; nested exception is: 
    java.net.ConnectException: Connection refused: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
    at sun.rmi.server.UnicastRef.newCall(Unknown Source)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at java.rmi.Naming.rebind(Unknown Source)
    at epl362Project.Server.main(Server.java:10)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
    ... 7 more

我做错了什么?客户端和服务器端都将在我的笔记本电脑上运行,因为这只是一个练习。我错过了什么还是我的代码有问题?除了给我答案之外,请解释为什么会这样,因为我不只是想让它发挥作用,我正在努力学习。

**编辑 我发现了为什么我的代码不起作用。我错过了一行代码

LocateRegistry.createRegistry(2020);

这是我从 *** 上的其他问题中找到的。但是没有任何解释,我也没有在网上找到关于为什么 RMI 需要此代码才能正常工作的解释。有人解释一下吗?

【问题讨论】:

【参考方案1】:

Naming.rebind() 的目标是 RMI 注册表。它必须在运行。它没有运行。所以你无法连接到它。所以你有一个ConnectException

我相信实现的代码并不重要,因为它只是将运行代码的实现接口。

这既无意义又无关紧要。接口不“运行代码”。类中的方法运行代码,在这种情况下,实现类运行代码。但是,您的问题不在于“运行[宁]代码”,而在于连接到注册表。

【讨论】:

2020 年呢?它是运行 RMI 或网络连接的特定端口还是什么? (这对我来说是全新的)或者我可以放任何我想要的端口吗? 我不是在复制代码,我是在看一个 youtube 教程:P 感谢大佬的帮助

以上是关于本地主机上的 RMI 连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

本地主机上的 MySQL 连接被拒绝

XMPP Openfire 连接被拒绝

与 localhost 的 Rmi 连接被拒绝

Cosmos SDK远程连接被拒绝

Tomcat/Hibernate 与 MySql 的连接失败,出现“通信链接失败”和“权限被拒绝”

模拟本地主机上的慢速连接