解決:java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:

實驗環境

windows10;
idea2018.1.3;
scala 2.11.12;

報錯詳情

當註冊一個服務時,出現如下報錯:

Exception in thread "main" java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
	java.net.ConnectException: Connection refused: connect
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
	at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
	at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
	at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:338)
	at sun.rmi.registry.RegistryImpl_Stub.rebind(RegistryImpl_Stub.java:147)
	at java.rmi.Naming.rebind(Naming.java:177)
	at com.atguigu.chapter17.rmi.MyRemoteImpl$.main(MyRemoteImpl.scala:30)
	at com.atguigu.chapter17.rmi.MyRemoteImpl.main(MyRemoteImpl.scala)
Caused by: java.net.ConnectException: Connection refused: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method)
	at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at java.net.Socket.connect(Socket.java:538)
	at java.net.Socket.<init>(Socket.java:434)
	at java.net.Socket.<init>(Socket.java:211)
	at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
	at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148)
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
	... 7 more

解決方案

Naming.rebind("rmi://127.0.0.1:9992/RemoteHello", service)
使用這種方式出現錯誤,於是我們可以換種方式:
參考文章-StackOverflow

val registry: Registry = LocateRegistry.createRegistry(9999)
registry.rebind("RemoteHello", service)

這時就可以成功啓動了,如下午所示:
在這裏插入圖片描述

項目源碼

這邊貼上源碼,可以自己測試。

  • 項目結構圖
    在這裏插入圖片描述
    MyRemote.scala
package com.atguigu.chapter17.rmi

import java.rmi.{Remote, RemoteException}

// 這是一個接口文件,該文件會提供給遠程端和本地使用
trait MyRemote extends Remote {
  //一個抽象方法
  @throws(classOf[RemoteException])
  def sayHello(): String //throws RemoteException
}

MyRemoteClient.scala

package com.atguigu.chapter17.rmi

import java.rmi.Naming

/**
  * Author: Solarzhou
  * data: 2019/12/6 15:18
  * desc:
  */
class MyRemoteClient {
  def go() = {
    val service = Naming.lookup("rmi://127.0.0.1:9999/RemoteHello").asInstanceOf[MyRemote]
    val str = service.sayHello()
    println("str = " + str)
  }
}

object MyRemoteClient {
  def main(args: Array[String]): Unit = {
    new MyRemoteClient().go()
  }

}

MyRemotelmpl.scala

package com.atguigu.chapter17.rmi

import java.rmi.registry.{LocateRegistry, Registry}
import java.rmi.{Naming, RemoteException}
import java.rmi.server.UnicastRemoteObject


/**
  * Author: Solarzhou
  * data: 2019/12/6 14:54
  * desc:
  */
// 這裏就實現了MyRemote trait
class MyRemoteImpl extends UnicastRemoteObject with MyRemote {
  @throws(classOf[RemoteException])
  override def sayHello(): String = {
    "Hello World!~"
  }
}

object MyRemoteImpl {
  def main(args: Array[String]): Unit = {
    val service: MyRemote = new MyRemoteImpl()
    //準備把服務綁定到9999端口
    //第一種方式
    val registry: Registry = LocateRegistry.createRegistry(9999)
    registry.rebind("RemoteHello", service)
    //Naming.rebind("RemoteHello", service)
    // 第二種方式
    //    Naming.rebind("rmi://127.0.0.1:9992/RemoteHello", service)
    println("遠程服務開啓,在127.0.0.1 的 9999端口監聽,服務名 RemoteHello")
  }
}

發佈了91 篇原創文章 · 獲贊 55 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章