web-dev-qa-db-ja.com

java.rmi.ConnectException:ホストへの接続が拒否されました:127.0.0.1

RMIを使用してみました。これがサーバー側です。最初は例外なく動作しましたが、以下のコードを実行しようとすると3回実行すると、エラーが発生します。

コードは次のとおりです。

import Java.rmi.server.UnicastRemoteObject;

/**
 * Created by elyas on 12/11/14 AD.
 */
public class LogicImplement extends UnicastRemoteObject implements Logic
{

    public LogicImplement() throws Exception
    {
        Java.rmi.registry.LocateRegistry.createRegistry(6060);
        Java.rmi.Naming.rebind("Object1",this);
    }

    @Override
    public int sum(int a, int b) throws Exception
    {
        int result = a + b;
        System.out.println("ana sum executed");
        return result;
    }

    public static void main(String[] args)
    {
        try
        {
            LogicImplement logicImplement  = new LogicImplement();
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    } 
} 

エラーは次のようになります。Object1をたとえばObject2に変更しようとしましたが、エラーが発生し、ポート番号も変更します。

解決策は何ですか?

Java.rmi.ConnectException: Connection refused to Host: 127.0.0.1; nested exception is: 
    Java.net.ConnectException: Connection refused
    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:341)
    at Sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at Java.rmi.Naming.rebind(Naming.Java:177)
    at LogicImplement.<init>(LogicImplement.Java:12)
    at LogicImplement.main(LogicImplement.Java:27)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.Java:120)
Caused by: Java.net.ConnectException: Connection refused
    at Java.net.PlainSocketImpl.socketConnect(Native Method)
    at Java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.Java:339)
    at Java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.Java:200)
    at Java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.Java:182)
    at Java.net.SocksSocketImpl.connect(SocksSocketImpl.Java:392)
    at Java.net.Socket.connect(Socket.Java:579)
    at Java.net.Socket.connect(Socket.Java:528)
    at Java.net.Socket.<init>(Socket.Java:425)
    at Java.net.Socket.<init>(Socket.Java:208)
    at Sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.Java:40)
    at Sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.Java:147)
    at Sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.Java:613)
    ... 12 more
4
Elyas Hadizadeh

答えは非常に単純でした。デフォルトでは、レジストリはポート1099で実行されます。別のポートでレジストリを開始するには、コマンドラインでポート番号を指定します。 CLASSPATH環境変数の設定を解除することを忘れないでください。詳細については、次のリンクを確認してください。 サンプルプログラムの実行

**したがって、このコードを修正するには、ポート番号を6060から1099に変更する必要があります

注意:1099が他のサービスで使用されている場合は1100をテストする必要があり、1100も使用されている場合は、1101などを使用する必要があります。 :-)

2
Elyas Hadizadeh
Java.net.ConnectException: Connection refused

この例外にはいくつかの理由が考えられます。

  • rmiregistryをバックグラウンドで開始していません。
  • 間違ったポート番号に接続しようとしています。
  • ファイアウォールが接続をブロックしている可能性があります。
2
Darshan Lila

これはポート番号の問題であったため、必要なポート番号でレジストリを開始する別の方法があります。

Java.rmi.registry.Registry rmiRegistry = Java.rmi.registry.LocateRegistry.
                createRegistry(6060); // Creates a registry on 6060
rmiRegistry.rebind("Object1",this);   // Binds to registry created on 6060
1
Dula

RMIレジストリを開始していません。

これを乗り越えても、リモートメソッドを呼び出したときにそれが発生する場合は、 RMI FAQの項目A.1 を参照してください。

0
user207421