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 上使用它)。在远程方法的程序逻辑中,我正在创建一个 Socket,而在另一个线程中,我正在创建一个 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)

我在同一台机器上运行所有模块(即本地主机)

在一个独立的类中,相同的逻辑可以正常工作,没有任何错误。我的问题是我的程序抛出这样的异常是因为 RMI 和 Sockets 吗?如果是这样,我该如何解决这个问题。

4

1 回答 1

0

ServerSocket 抱怨它无法绑定到端口 60000,因为它已经在使用中。要么你没有关闭前一个,要么其他东西正在使用它。您需要在 finally 块中关闭它;如果出现异常,您当前的代码将导致此问题。

与 RMI 无关,除了此实现一次只能由一个客户端使用。也许您应该在端口 0 上创建 ServerSocket,并将其本地端口号作为创建它的方法调用的结果返回给客户端,并在单独的线程中为其提供服务。或者也许应该创建一次而不是每次调用。

于 2013-05-04T00:02:28.337 回答