2012-12-09 12 views
9

Ich habe viele Threads zu diesem Thema gelesen, und ich konnte nicht eine "echte" Lösung dafür sehen.Verwenden von JAVA RMI in Android-Anwendung

Ich machte ein Java-Projekt - das ist ein rmi-Server und ich habe eine Android-Anwendung, die auch ein RMI-Client sein soll.

Als ich überprüft habe, ob der Server funktioniert, war ich nicht klug genug, um den Client auf einem Android-Projekt zu testen, und ich machte einen Test-Client auf einem einfachen Java-Projekt.

Jetzt, wenn ich versuche, meine Android-Anwendung mit dem Server zu verbinden, scheitere ich, weil das Android-Projekt das Java Rmi-Paket nicht erkennt.

Warum das passieren? was soll ich machen?

+0

Ich denke, dass die Bibliothek, die Sie verwenden, nicht Dalvik Vm unterstützt wird. –

+0

mehr dazu hier: -http: //stackoverflow.com/questions/5321906/how-to-find-the-jar-of-java-rmi-package –

+0

Ich beantwortete die ähnliche Frage auf diesem Stapel [post] (http://stackoverflow.com/questions/5900157/is-it-possible-to-import-java-rmi-in-android/24943260#24943260), überprüfen Sie es, wenn Sie –

Antwort

4

Ich hatte das gleiche Problem und änderte meine Kommunikation zu Socket-Kommunikation!

Soweit ich herausfinden konnte Java.rmi leider nicht mit Android und daher ist es nicht möglich, es zu verwenden.

Allerdings gibt es einige weitere Diskussionen in this Post.

6

Sie können auch die folgende Bibliothek verwenden LipeRMI

Hier ist ein Beispiel für ein Android-Client mit Java Server über LipeRMI interagieren. Erstellen Sie die folgenden 2 Klassen und eine Schnittstelle für die Java-Anwendung.

//TestService.java 
package test.common; 

public interface TestService { 

    public String getResponse(String data); 
} 

//TestServer.java 
import java.io.IOException; 
import java.net.Socket; 

import test.common.TestService; 

import lipermi.exception.LipeRMIException; 
import lipermi.handler.CallHandler; 
import lipermi.net.IServerListener; 
import lipermi.net.Server; 

public class TestServer implements TestService { 

    public TestServer() { 
     try { 
      CallHandler callHandler = new CallHandler(); 
      callHandler.registerGlobal(TestService.class, this); 
      Server server = new Server(); 
      server.bind(7777, callHandler); 
      server.addServerListener(new IServerListener() { 

       @Override 
       public void clientDisconnected(Socket socket) { 
        System.out.println("Client Disconnected: " + socket.getInetAddress()); 
       } 

       @Override 
       public void clientConnected(Socket socket) { 
        System.out.println("Client Connected: " + socket.getInetAddress()); 
       } 
      }); 
      System.out.println("Server Listening"); 
     } catch (LipeRMIException | IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public String getResponse(String data) { 
     System.out.println("getResponse called"); 
     return "Your data: " + data; 
    } 

} 


//TestMain.java 
public class TestMain { 

    public static void main(String[] args) { 
     TestServer testServer = new TestServer(); 
    } 
} 

Android-Client:

//MainActivity.java 
package com.example.lipermidemoandroidclient; 

import java.io.IOException; 

import test.common.TestService; 

import lipermi.handler.CallHandler; 
import lipermi.net.Client; 
import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Looper; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    private String serverIP = "192.168.1.231"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button btnGet = (Button) findViewById(R.id.btnGet); 
     btnGet.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       new Conn().execute(); 
      } 
     }); 

    } 

    class Conn extends AsyncTask<Void, Void, MainActivity> { 

     @Override 
     protected MainActivity doInBackground(Void... params) { 
      Looper.prepare(); 
      try { 
       CallHandler callHandler = new CallHandler(); 
       Client client = new Client(serverIP, 7777, callHandler); 
       TestService testService = (TestService) client.getGlobal(TestService.class); 
       String msg = testService.getResponse("qwe"); 
       //Toast.makeText(MainActivity.this, testService.getResponse("abc"), Toast.LENGTH_SHORT).show(); 
       Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); 
       client.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      Looper.loop(); 
      return null; 
     } 

    } 
} 

//TestService.java 
package test.common; 

public interface TestService { 

    public String getResponse(String data); 
} 

Fügen Sie die LipeRMI Bibliothek sowohl für die Projekte
Stellen Sie sicher, INTERNET Erlaubnis in Android-Projekt
Auch stellen Sie sicher, fügen Sie die TestService.java Datei platziert haben in gleicher Paketname an beiden Stellen für z. test.common package here
Ändern Sie auch den Wert der serverIP-Variablen in Android MainActivity.java in die IP-Adresse des Computers, auf dem der Java-Code ausgeführt wird.

+0

möchten, stellen Sie bitte weitere Informationen zur Verfügung, um das Problem zu lösen nicht nur der Link zu einer Bibliothek – slfan

+0

Hallo @Abhilash! Verwenden Sie LipeRMI noch? Wenn ja, haben Sie bis jetzt irgendwelche Schwierigkeiten damit gehabt? –

0

Android unterstützt RMI nicht. Sie sollten zur Socket- oder Raw-TCP-Kommunikation wechseln.