Using JAVA RMI in Android application

后端 未结 3 575
旧时难觅i
旧时难觅i 2020-12-14 12:15

I\'ve read lots of threads about this issue, and i couldnt see a \'real\' solution for it.

I made a java project - which is a rmi server and i have an android applic

相关标签:
3条回答
  • 2020-12-14 12:25

    Android doesn't support RMI. You should change to socket or raw TCP communication.

    0 讨论(0)
  • 2020-12-14 12:36

    You can also use the following library LipeRMI

    Here is an example of a Android client interacting with Java Server via LipeRMI. Create the Following 2 classes and a interface for Java application.

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

    Add the LipeRMI library to both the projects
    Make sure you add INTERNET permission in Android project
    Also make sure you have the TestService.java file placed in same package name at both places for eg. test.common package here
    Also change value of serverIP variable in Android MainActivity.java to the IP of the machine running the Java code.

    0 讨论(0)
  • 2020-12-14 12:37

    I had the same problem and changed my communication to socket communication!

    As far as I could figure out Java.rmi unfortunately does not come with Android and therefore it's not possible to use it.

    However there are some more disucssions in this post.

    0 讨论(0)
提交回复
热议问题