2012-12-09 28 views
9

Tôi đã đọc rất nhiều chủ đề về vấn đề này và tôi không thể thấy giải pháp 'thực sự' cho nó.Sử dụng JAVA RMI trong ứng dụng Android

Tôi đã tạo một dự án java - một máy chủ rmi và tôi có một ứng dụng Android giả sử cũng là một ứng dụng khách RMI.

Khi tôi kiểm tra xem máy chủ có hoạt động không đủ khôn ngoan để thử nghiệm ứng dụng khách trên một dự án Android và tôi đã tạo một ứng dụng thử nghiệm trên một dự án java đơn giản.

Bây giờ khi tôi đang cố gắng kết nối ứng dụng Android của tôi với máy chủ tôi không thành công vì dự án Android không nhận ra gói rmi java.

Tại sao điều đó xảy ra? tôi nên làm gì?

+0

Tôi nghĩ rằng thư viện mà bạn đang sử dụng không hỗ trợ valvik vm. –

+0

thêm về điều này là ở đây: -http: //stackoverflow.com/questions/5321906/how-to-find-the-jar-of-java-rmi-package –

+0

Tôi đã trả lời câu hỏi tương tự tại ngăn xếp này [bài đăng] http://stackoverflow.com/questions/5900157/is-it-possible-to-import-java-rmi-in-android/24943260#24943260), hãy khám phá nếu bạn thích –

Trả lời

4

Tôi đã gặp sự cố tương tự và đã thay đổi giao tiếp của mình thành giao tiếp socket!

Theo như tôi có thể tìm ra Java.rmi tiếc là không đi kèm với Android và do đó nó không thể sử dụng nó.

Tuy nhiên, có một số disucssions khác trong bài đăng this.

6

Bạn cũng có thể sử dụng thư viện sau LipeRMI

Dưới đây là một ví dụ về một khách hàng Android tương tác với Java Server qua LipeRMI. Tạo 2 lớp sau và một giao diện cho ứng dụng 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 khách hàng:

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

Thêm thư viện LipeRMI cho cả dự án
Hãy chắc chắn rằng bạn thêm sự cho phép INTERNET trong dự án Android
Ngoài ra hãy chắc chắn rằng bạn có các tập tin TestService.java đặt trong cùng một tên gói ở cả hai vị trí cho ví dụ. gói test.common tại đây
Cũng thay đổi giá trị của biến serverIP trong Android MainActivity.java thành IP của máy chạy mã Java.

+0

vui lòng cung cấp thêm thông tin để giải quyết sự cố không chỉ liên kết đến thư viện – slfan

+0

Xin chào @Abhilash! Bạn vẫn sử dụng LipeRMI? Nếu vậy, bạn có gặp phải bất kỳ khó khăn nào với nó cho đến ngày không? –

0

Android không hỗ trợ RMI. Bạn nên thay đổi thành socket hoặc giao tiếp TCP thô.

Các vấn đề liên quan