在Android应用程序中使用JAVA RMI

我已经阅读了很多关于这个问题的线索,而且我看不到一个“真正的”解决scheme。

我做了一个java项目 – 这是一个rmi服务器,我有一个android应用程序,它也是一个rmi客户端。

当我检查如果服务器的工作原理我不够聪明来testing客户端上的一个Android项目,我做了一个简单的Java项目的testing客户端。

现在,当我试图连接我的android应用程序到服务器我失败,因为android项目不能识别java rmi包。

为什么会发生? 我该怎么办?

Solutions Collecting From Web of "在Android应用程序中使用JAVA RMI"

我有同样的问题,并改变我的沟通到套接字通信!

据我所知,Java.rmi不幸的是没有与Android,因此它是不可能的。

不过在这篇文章中还有更多的争论。

您也可以使用以下库LipeRMI

下面是一个Android客户端通过LipeRMI与Jav​​a服务器交互的例子。 创build以下2个类和Java应用程序的接口。

//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客户端:

 //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); } 

将LipeRMI库添加到两个项目中
确保您在Android项目中添加INTERNET权限
还要确保你在两个地方都有相同包名的TestService.java文件。 test.common包在这里
还要将Android MainActivity.java中的serverIPvariables的值更改为运行Java代码的机器的IP。

Android不支持RMI。 您应该更改为套接字或原始TCP通信。