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
答えは非常に単純でした。デフォルトでは、レジストリはポート1099で実行されます。別のポートでレジストリを開始するには、コマンドラインでポート番号を指定します。 CLASSPATH環境変数の設定を解除することを忘れないでください。詳細については、次のリンクを確認してください。 サンプルプログラムの実行
**したがって、このコードを修正するには、ポート番号を6060から1099に変更する必要があります
注意:1099が他のサービスで使用されている場合は1100をテストする必要があり、1100も使用されている場合は、1101などを使用する必要があります。 :-)
Java.net.ConnectException: Connection refused
この例外にはいくつかの理由が考えられます。
rmiregistry
をバックグラウンドで開始していません。これはポート番号の問題であったため、必要なポート番号でレジストリを開始する別の方法があります。
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
RMIレジストリを開始していません。
これを乗り越えても、リモートメソッドを呼び出したときにそれが発生する場合は、 RMI FAQの項目A.1 を参照してください。