javarmi-传递对象
我在javarmi-传递对象,java,android,raspberry-pi,rmi,Java,Android,Raspberry Pi,Rmi,我在Raspberry Pi上运行Java程序,在智能手机上运行Android应用程序。应用程序应该能够调用在Raspi上运行的方法。 由于Android不包含标准的javarmi包,我使用了LipeRMI: 到目前为止,LipeRMI在传递基本数据类型(如boolean或int)时运行良好 我现在要做的是将ArrayList从服务器传递到应用程序,但每次运行该方法时,我都会收到以下错误: LipeRMIException:Class java.util.ArrayList is not ass
Raspberry Pi
上运行Java程序,在智能手机上运行Android应用程序。应用程序应该能够调用在Raspi
上运行的方法。
由于Android
不包含标准的javarmi包,我使用了LipeRMI
:
到目前为止,LipeRMI
在传递基本数据类型(如boolean或int)时运行良好
我现在要做的是将ArrayList
从服务器传递到应用程序,但每次运行该方法时,我都会收到以下错误:
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;
}
}
import java.util.ArrayList;
public interface ServerInt{
public ArrayList<String> getPWMLines();
}
公共类RMIServer实现ServerInt{
私有静态最终长serialVersionUID=1L;
私有数组列表;
公共服务器(){
列表=新的ArrayList();
添加(“50:25:5:-1”);
添加(“99:42:6:4”);
createServer();
}
public void createServer(){
试一试{
CallHandler CallHandler=新的CallHandler();
registerGlobal(ServerInt.class,this);
exportObject(ServerInt.class,list);
服务器=新服务器();
bind(7777,callHandler);
addServerListener(新的IServerListener(){
@凌驾
public void clientDisconnected(套接字){}
@凌驾
public void clientConnected(套接字){}
});
}捕获(LipeRMIException | IOE异常){
e、 printStackTrace();
}
}
@凌驾
公共阵列列表getPWMLines(){
退货清单;
}
}
ServerInt.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;
}
}
import java.util.ArrayList;
public interface ServerInt{
public ArrayList<String> getPWMLines();
}
import java.util.ArrayList;
公共接口ServerInt{
公共阵列列表getPWMLines();
}
您显然误用了方法CallHandler#exportObject(类,对象)
第一个参数必须是表示接口的类,第二个参数必须是实现此接口的类的实例。这里您提供了一个ArrayList
作为第二个参数,它显然不是ServerInt
的实例,这就是为什么会出现此异常
下面是如何使用此方法的一个很好的示例:
MyRemoteListener listenerImplementation = new MyRemoteListenerImpl();
callHandler.exportObject(MyRemoteListener.class, listenerImplementation);
在这种情况下,第一个参数是接口MyRemoteListener
,第二个参数是接口MyRemoteListenerImpl
的一个实例,它是接口MyRemoteListener
的实现
要公开您的列表
您可以尝试callHandler.registerGlobal(List.class,List)
您显然误用了方法callHandler\exportObject(class,Object)
第一个参数必须是表示接口的类,第二个参数必须是实现此接口的类的实例。这里您提供了一个ArrayList
作为第二个参数,它显然不是ServerInt
的实例,这就是为什么会出现此异常
下面是如何使用此方法的一个很好的示例:
MyRemoteListener listenerImplementation = new MyRemoteListenerImpl();
callHandler.exportObject(MyRemoteListener.class, listenerImplementation);
在这种情况下,第一个参数是接口MyRemoteListener
,第二个参数是接口MyRemoteListenerImpl
的一个实例,它是接口MyRemoteListener
的实现
要公开您的列表
,您可以尝试callHandler.registerGlobal(List.class,List)
谢谢您的提示:)但是我如何导出ArrayList呢?@JasOn您不能。您必须导出RMIServer
对象。@EJP也尝试过,但每次我尝试获取ArrayList时,我的应用程序都会崩溃:/现在与您的建议配合得很好,谢谢您的帮助谢谢您的提示:)但是我如何导出ArrayList呢?@JasOn您不能。您必须导出RMIServer
对象。@EJP也尝试过,但每次我尝试获取ArrayList时,我的应用程序都会崩溃:/n现在您的建议很好,谢谢您的帮助