0

クライアントからサーバーにファイルを転送するには、RMI メソッドを呼び出す必要があります (RMI メソッドの実行)。

コードはこちら

RegisterMain : RMI メソッドを持つ Java ファイル

Transfer : ファイルをサーバーに送信する必要があるクライアント クラス。

Test : 両方の操作を呼び出すクラス。

public class RegisterMain extends UnicastRemoteObject implements RegMethod{


protected RegisterMain() throws RemoteException {

    super();
    System.out.println("We're Connected");
}

@Override
public void FTransfer(String fname) throws RemoteException{

    try
    {
        String path="temp"+fname;
        File f2=new File(path);

        try {

            Socket cli=new Socket("127.0.0.1",60000);
            ObjectOutputStream outs = new ObjectOutputStream(cli.getOutputStream());
            ObjectInputStream ins = new ObjectInputStream(cli.getInputStream());
            FileWriter fw=new FileWriter(f2);
            BufferedWriter bw=new BufferedWriter(fw);


            int iter=(Integer) ins.readObject();
            System.out.println("Iterations :"+iter);

            String str;

            for(int i=0;i<iter;i++)
            {
                str=(String)ins.readObject();
                System.out.println(i);
                fw.write(str);
            }

            str=(String)ins.readObject();
            fw.write(str);

            outs.writeObject(new String("OverandOut"));

            fw.close();
            bw.close();
            cli.close();


        } catch (Exception e) {
            e.printStackTrace();
        }


    }
    catch(Exception e)
    {

    }


}

} 

移行 :

public class Transfer extends Thread {


String fname;

public Transfer(String name) {

    fname=name;

}

@Override
public void run() {

    super.run();

    try {

        ServerSocket ser = new ServerSocket(60000);
        Socket cli=ser.accept();

        ObjectOutputStream outs = new ObjectOutputStream(cli.getOutputStream());
        ObjectInputStream ins = new ObjectInputStream(cli.getInputStream());

        File f1=new File(fname);
        FileReader fr=new FileReader(f1);
        BufferedReader br=new BufferedReader(fr);

        int flen=(int)f1.length();
        int iter=(int)flen/1024;
        int latent=flen%1024;
        System.out.println("Iterations :"+iter);

        outs.writeObject(new Integer(iter));

        char[] buff=new char[1024];
        for(int i=0;i<iter;i++)
        {

            fr.read(buff, 0, 1024);
            outs.writeObject(new String(buff, 0, 1024));
        }

        fr.read(buff, 0, latent);
        outs.writeObject(new String(buff, 0, latent));

        if(((String)ins.readObject()).equals("OverandOut"))
        {
            System.out.println("Terminating Connection.");
        }

        fr.close();
        br.close();
        ser.close();


    } catch (Exception e) {
        e.printStackTrace();
    }

}

@Override
public synchronized void start() {

    super.start();
    run();

}


 }

テスト :

public class Test {

public static void main(String[] args) throws UnknownHostException {


    try
    {
         RegMethod intr=(RegMethod)Naming.lookup("//127.0.0.1/Register");

         Thread t1,t2,t3;
         t1=new Transfer("Final.class");
         t1.start();
         intr.FTransfer("Final.class");

         t1=new Transfer("StatStore.class");
         t1.start();
         intr.FTransfer("StatStore.class");

         t1=new Transfer("Test.class");
         t1.start();
         intr.FTransfer("Test.class");


    }catch(Exception e)
    {
        e.printStackTrace();
    }

}

}

RMIを使用して同じ(localhost)システムでメソッドを呼び出しています(これをUbuntuで使用しています)。リモート メソッドのプログラム ロジックでソケットを作成し、別のスレッドで ServerSocket を作成しています。リモートプロシージャを呼び出す前に、スレッドを実行しています。

さまざまなポートを使用してプログラムを実行しようとしましたが、常に例外がスローされます

    java.net.SocketException: Address already in use
    at java.net.PlainSocketImpl.socketListen(Native Method)
    at java.net.AbstractPlainSocketImpl.listen(AbstractPlainSocketImpl.java:365)
    at java.net.ServerSocket.bind(ServerSocket.java:337)
    at java.net.ServerSocket.<init>(ServerSocket.java:202)
    at java.net.ServerSocket.<init>(ServerSocket.java:114)
    at Transfer.run(Transfer.java:39)
    at Transfer.start(Transfer.java:87)
    at Test.main(Test.java:24)

すべてのモジュールを同じマシン (つまり、localhost) で実行しています。

スタンドアロン クラスでは、同じロジックがエラーなしで機能します。私の質問は、私のプログラムがそのような例外をスローしているのは、RMI とソケットの両方が原因でしょうか?? もしそうなら、どうすれば問題を解決できますか。

4

1 に答える 1

0

ServerSocket は、既に使用されているため、ポート 60000 にバインドできないと不平を言っています。前のものを閉じていないか、他の何かがそれを使用しています。finally ブロックで閉じる必要があります。例外がある場合、現在のコードでこの問題が発生します。

この実装は一度に 1 つのクライアントのみが使用できることを除いて、RMI とはまったく関係ありません。おそらく、ポート 0 で ServerSocket を作成し、それを作成するメソッド呼び出しの結果としてそのローカル ポート番号をクライアントに返し、それを別のスレッドで処理する必要があります。または、呼び出しごとではなく一度作成する必要があるかもしれません。

于 2013-05-04T00:02:28.337 に答える