[英]Java RMI - Passing Objects
我正在智能手機上的Raspberry Pi
和Android-App
上運行Java程序。 該應用程序應該能夠調用在Raspi
上運行的Raspi
。 由於Android
不包含標准的Java RMI包,我使用了LipeRMI
: http : LipeRMI
到目前為止, LipeRMI
確實可以很好地傳遞原始數據類型,如boolean或int。
我現在要做的是將ArrayList<String>
從服務器傳遞給應用程序,但每次運行該方法時,都會收到以下錯誤:
LipeRMIException:Class java.util.ArrayList is not assignable from control.ServerInt
at lipermi.handler.CallHandler.exportObject(CallHandler.java:54)
at lipermi.handler.CallHandler.exportObject(CallHandler.java:48)
at control.RMIServer.createServer(RMIServer.java:26)
at control.Main.main(Main.java:17)
我不明白我在這里做錯了什么。
RMIServer.java
public class RMIServer implements ServerInt{
private static final long serialVersionUID = 1L;
private ArrayList<String> list;
public RMIServer() {
list = new ArrayList<String>();
list.add("50:25:5:-1");
list.add("99:42:6:4");
createServer();
}
public void createServer() {
try {
CallHandler callHandler = new CallHandler();
callHandler.registerGlobal(ServerInt.class, this);
callHandler.exportObject(ServerInt.class, list);
Server server = new Server();
server.bind(7777, callHandler);
server.addServerListener(new IServerListener() {
@Override
public void clientDisconnected(Socket socket) {}
@Override
public void clientConnected(Socket socket) {}
});
} catch (LipeRMIException | IOException e) {
e.printStackTrace();
}
}
@Override
public ArrayList<String> getPWMLines() {
return list;
}
}
ServerInt.java
import java.util.ArrayList;
public interface ServerInt{
public ArrayList<String> getPWMLines();
}
您顯然濫用CallHandler#exportObject(Class, Object)
,第一個參數必須是表示接口的類,第二個參數必須是實現此接口的類的實例。 在這里,您提供了一個ArrayList
作為第二個參數,它顯然不是ServerInt
一個實例,這就是您獲得此異常的原因。
以下是如何使用此方法的一個很好的示例:
MyRemoteListener listenerImplementation = new MyRemoteListenerImpl();
callHandler.exportObject(MyRemoteListener.class, listenerImplementation);
在這種情況下,第一個參數是接口MyRemoteListener
和第二個是一個實例MyRemoteListenerImpl
這是接口的實現MyRemoteListener
。
要公開你的List
你可以嘗試callHandler.registerGlobal(List.class, list)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.