0

私は 2 台のコンピューターを持っています。そのうちの 1 つで、RMI レジストリを実行しています。これは、このコードだけで作成されたものです。

package main;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Scanner;

public class TheRegistry{

    public static void main(String[] args) {
        try {
            Registry reg = LocateRegistry.createRegistry(2020);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally{
            System.out.println("Registry Created");
            Scanner input = new Scanner(System.in);
            input.nextInt();
            System.exit(0);
        }
    }
}

他のコンピューターには、このレジストリーにオブジェクトを登録しようとしているサーバーがありますが、例外が発生します。サーバーのコードは次のとおりです。

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.*;

public class TextScramblerServer implements TextScramblerInterface 
{
    private static Remote obj; 
    // main method to export
    @Override //Return input text as-is.
    public String testInputText(String inputText) {

        return "Your input text is: " + inputText;
    }

    @Override //Return the string reversed.
    public String reverse(String inputText) {
        String reversedInput = "";
        for(int i=0; i<inputText.length();i++)
        {
            reversedInput=reversedInput+inputText.charAt((inputText.length()-1)-i);
        }
        return "Result: "+reversedInput;
    }

    @Override //Return the string scrambled.
    public String scramble(String inputText) {
        String scrambledInput="";

        for(int i=0; i<inputText.length();i++)
        {
            if(i%2==0)
            {
                scrambledInput=scrambledInput+inputText.charAt(i);
            }
            else
            {
                scrambledInput=inputText.charAt(i)+scrambledInput;
            }
        }
        return "Result: "+scrambledInput;
    }

    public void exportServer() throws Exception {
        System.setSecurityManager(new RMISecurityManager());
        obj = UnicastRemoteObject.exportObject(this, 2022);
        Registry registry = LocateRegistry.getRegistry("132.205.94.50", 2020);
        registry.bind("test", obj);
    }

    public static void main(String[] args) {
        try {
            (new TextScramblerServer()).exportServer();
            System.out.println("Server is up and running");
        }
        catch(Exception e){
            e.printStackTrace();
            try {
                UnicastRemoteObject.unexportObject(obj, true); //close port
            } catch (NoSuchObjectException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }
}

エラーが発生し続けます:

java.rmi.ConnectException: Connection refused to host: 132.205.94.50; 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.bind(Unknown Source)
    at TextScramblerServer.exportServer(TextScramblerServer.java:57)
    at TextScramblerServer.main(TextScramblerServer.java:62)
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
java.rmi.NoSuchObjectException: object not exported
    at sun.rmi.transport.ObjectTable.unexportObject(Unknown Source)
    at java.rmi.server.UnicastRemoteObject.unexportObject(Unknown Source)
    at TextScramblerServer.main(TextScramblerServer.java:68)

なぜこれが起こっているのかわかりません。私はすべてを試したと思います

4

2 に答える 2

1

あなたのコードを実行したところ、セキュリティ ポリシーを構成した後、うまくいきました。

ConnectionRefused 例外は、基礎となる TCP 接続を確立できないことを意味します。これは RMI の問題ではなく、ネットワークの問題です。

サーバーとレジストリの両方を同じホストで実行してみてlocalhost、ホスト名として使用してください。これが機能する場合、問題は 2 つのホスト間のファイアウォールの問題である可能性があります。

telnet を使用して、特定のポートへの TCP 接続の簡単なテストを行うことができます。 ポートがリッスンしていない場合、telnet は同様の接続拒否メッセージを表示します。ポートがリッスンしている場合、ターミナルに次のようなメッセージが表示されます。

Connected to localhost.
Escape character is '^]'.

Control-C でセッションから抜けます。

特定の telnet 出力は OS によって異なる場合がありますが、ほぼ同じです。

ファイアウォールの問題である場合は、ポートを開く必要があります。その方法は OS によって異なりますが、簡単に見つけることができます。

于 2015-10-01T23:42:25.373 に答える