Действительно ли возможно использовать RMI, двунаправленный между двумя классами?

Принятый ответ на самом деле серьезно устарел. В Android Studio 3.x.x нет необходимости создавать дополнительную папку макета (в любом случае я не уверен, что это было необходимо).

Также нет необходимости менять масштаб проекта с Android на Project, как вам говорит принятый ответ.

Также нет необходимости редактировать какие-либо атрибуты и режимы пользовательского интерфейса, как говорится в принятом ответе.

Всего 2 шага:

1) Откройте базовый макет пользовательского интерфейса в режиме ДИЗАЙН , чтобы вы могли видеть фактический графический интерфейс пользователя, например кнопки, значки и т. Д. это как текст, в режиме просмотра кода XML).

2) Щелкните значок, отмеченный на снимке экрана ниже, и в меню выберите Создать изменение ландшафта (помечено на скриншоте как «Нажмите 2-й»).

Затем Studio делает всю работу за вас, и это работает как шарм. Нет необходимости добавлять дополнительный код и дополнительные папки не создаются.

Наслаждайтесь.

Android Studio 3.1.4:

enter image description here

12
задан Markus 26 May 2009 в 17:46
поделиться

7 ответов

Если B реализует Remote , его можно экспортировать и передать как параметр в вызове RMI к A . В этом сценарии нет необходимости регистрировать B в реестре RMI, поскольку клиенту явно передается ссылка на него.

9
ответ дан 2 December 2019 в 21:45
поделиться

Прошло некоторое время с тех пор, как я использовал RMI, но IIRC, если класс B реализует java.rmi.Remote и передает ссылку на свой экземпляр в качестве параметра к методу в классе A, тогда класс A должен получить заглушку, и методы, вызываемые из него, будут вызываться в исходном экземпляре.

Однако, если у вас есть много таких RMI-вызовов, возвращающихся и оттуда, вы, вероятно, столкнетесь с проблемы с производительностью.

1
ответ дан 2 December 2019 в 21:45
поделиться

Если вы передаете B в качестве аргумента методу в A , а затем используете эту ссылку для вызова метода в B ] Я вполне уверен, что установлено обратное соединение, и я вполне уверен, что реестр RMI создается для JVM, где находится B . В какой-то момент у нас возникли проблемы с особенно строгими правилами брандмауэра. Наш код выглядел примерно как

Веб-сервер

public int uploadFile(FileItem fileItem){
    return ApplicationClassLoader
        .get(DocumentManager.class)
        .attachFile(new RemoteInputStreamImpl(fileItem.getInputStream());
    )
}

Сервер приложений

public int attachFile(RemoteInputStream in){
    ...

    byte[] buffer;
    while((buffer = in.read(1024)) != null) // Would return null to indicate EOF
      // Do some stuff

    return documentId;       
}
1
ответ дан 2 December 2019 в 21:45
поделиться

Но как класс B узнает о классе A без второго сервера RMI? Думаю, вам понадобятся два сервера.

-1
ответ дан 2 December 2019 в 21:45
поделиться

Некоторые службы RMI поддерживают обратные вызовы или прослушиватели, которые позволяют серверу асинхронно вызывать клиента по тому же соединению. (Извините, я не помню названия открытых библиотек, которые это делают, быстрый поиск в Google не очень помог) Стандартный RMI не поддерживает это, вместо этого вам также необходимо предоставить клиент как службу RMI.

-1
ответ дан 2 December 2019 в 21:45
поделиться

Обе JVM должны будут реализовать службы RMI. Но на самом деле очень легко взглянуть на различные классы в java.rmi.

Чего вы не можете сделать, так это каким-то образом использовать одно соединение RMI и осуществлять двустороннюю связь.

-1
ответ дан 2 December 2019 в 21:45
поделиться

RMI bidirectional:

SERVER:

import java.io.IOException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class RMISERVER {

   public RMISERVER() throws IOException {

       Thread t;
        try {
            t = new Prou_run();
            t.start();
        } catch (RemoteException ex) {
            Logger.getLogger(RMISERVER.class.getName()).log(Level.SEVERE, null, ex);
        }

   }


   public static void main(String args[]) throws IOException {
     new RMISERVER();
   }
}


import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.registry.Registry;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.tree.DefaultMutableTreeNode;

//extends java.rmi.server.UnicastRemoteObject
public class Prou_run extends Thread implements Runnable{

            New_Object  root = null,root2=null,root3=null,root4=null,root5;
              New_Object new_root=null;
            Object xt = null, xt2=null , xt3=null;
            Registry r1,r2;
            RMIClientSocketFactory csf,csf2;
            RMIServerSocketFactory ssf,sf2;


            new_Patryk npal;

 public Prou_run() throws java.rmi.RemoteException, IOException
 {
         if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
                  }

//            csf = new RMIClientSocketFactory() {
//
//                public Socket createSocket(String host, int port) throws IOException {
//                    return new Socket("rmi://localhost/getchil",1080);
//                }
//            };
//            csf2 = new RMIClientSocketFactory() {
//
//                public Socket createSocket(String host, int port) throws IOException {
//                   return new Socket("rmi://localhost/getchild",1081);
//                }
//            };
//            ssf=new RMIServerSocketFactory() {
//
//                public ServerSocket createServerSocket(int port) throws IOException {
//                    return new ServerSocket(1099);
//                }
//            };// ssf.createServerSocket(1099);
//              sf2=new RMIServerSocketFactory() {
//
//                public ServerSocket createServerSocket(int port) throws IOException {
//                   return new ServerSocket(1098);
//                }
//            };//sf2.createServerSocket(1098);
       try {
         r1=java.rmi.registry.LocateRegistry.createRegistry(1098);
                 r2=java.rmi.registry.LocateRegistry.createRegistry(1099);//, csf2, ssf);
                 java.rmi.registry.LocateRegistry.createRegistry(1097);
                 java.rmi.registry.LocateRegistry.createRegistry(1095);
                 java.rmi.registry.LocateRegistry.createRegistry(1096);
         System.out.println("RMI registry ready.");
      } catch (Exception e) {
         System.out.println("Exception starting RMI registry:");
         e.printStackTrace();
      }
        this.xt = null;this.xt2 = null;this.xt3 = null;
        npal = new new_Patryk();
        System.out.println("sdmmmfxxxxxxxx");

   }






    public void run() {

//while(true){

      try{

//             root =  new_root;
//             xt=npal.getChild((File)new_root.getob(), (int)new_root.geti());
             New_ObjectIMPL sl = new New_ObjectIMPL();
             sl.i=354;
                System.out.println("sdmmmf2");
                //r2
             Naming.rebind("rmi://localhost:1099/getchild",(New_Object) sl);
                System.out.println("sdmmmf3");

         }catch (Exception e) {
       System.out.println("Trouble: " + e);
     }

        while(new_root==null){
            try{
                 //System.out.println("sdmmmf1"   +   new_root.geti());
         new_root = (New_Object) Naming.lookup("rmi://localhost:1080/getchil");
         System.out.println("sdmmmf1"   +   new_root.geti());
            }catch (Exception e) {
       System.out.println("Trouble: " + e);
     }
        }
    }

}

























/**
 *
 * @author austinchuma
 */
public interface New_Object extends java.rmi.Remote {

     public int geti() throws java.rmi.RemoteException;

     public Object getob() throws java.rmi.RemoteException;

     public Object getobchild() throws java.rmi.RemoteException;

      public boolean getbbol() throws java.rmi.RemoteException;

       public byte[] getb() throws java.rmi.RemoteException;



}





public class New_ObjectIMPL extends java.rmi.server.UnicastRemoteObject implements New_Object

{
   Object ob = null,obchild = null;
    int  i=0;
    boolean bol = false;
    byte[] b = null;

    public New_ObjectIMPL() throws RemoteException{
        ob = null;obchild = null;
        i=0;
        bol = false;
        b = null;
    }

    public int geti() throws RemoteException {
       return i;
           }

    public Object getob() throws RemoteException {

       return ob;
    }

    public Object getobchild() throws RemoteException {
       return obchild;
    }

    public boolean getbbol() throws RemoteException {
      return bol;
    }

    public byte[] getb() throws RemoteException {

        return b;

    }


}
-1
ответ дан 2 December 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: