【问题标题】:Using JAVA RMI in Android application在 Android 应用程序中使用 JAVA RMI
【发布时间】:2012-12-09 15:21:26
【问题描述】:

我已经阅读了很多关于这个问题的帖子,但我看不到一个“真正的”解决方案。

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

当我检查服务器是否工作时,我没有足够的智慧在一个 android 项目上测试客户端,我在一个简单的 java 项目上做了一个测试客户端。

现在,当我尝试将我的 android 应用程序连接到服务器时,我失败了,因为 android 项目无法识别 java rmi 包。

为什么会这样?我该怎么办?

【问题讨论】:

标签: java android rmi


【解决方案1】:

您也可以使用以下库LipeRMI

这是一个 Android 客户端通过 LipeRMI 与 Java Server 交互的示例。 为 Java 应用程序创建以下 2 个类和一个接口。

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

安卓客户端:

//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中serverIP变量的值更改为运行Java代码的机器的IP。

【讨论】:

  • 请提供更多信息来解决问题,而不仅仅是图书馆的链接
  • 嗨@Abhilash!你还在使用 LipeRMI 吗?如果是这样,到目前为止,您是否遇到过任何困难?
【解决方案2】:

我也遇到了同样的问题,把通讯改成socket通讯了!

据我所知,不幸的是 Java.rmi 没有随 Android 提供,因此无法使用它。

不过,this 帖子中有更多讨论。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 2015-12-24
      • 2011-05-13
      • 2015-05-10
      • 2023-03-12
      • 1970-01-01
      • 2011-05-15
      相关资源
      最近更新 更多