Java RMI - 传递对象
Java RMI - Passing Objects
我正在运行在 Raspberry Pi
和 Android-App
智能手机上编写 Java 程序。该应用程序应该能够在 Raspi
上调用方法 运行ning。
由于 Android
不包含标准 Java RMI 包,我使用 LipeRMI
: http://lipermi.sourceforge.net/
到目前为止一切顺利,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)
第一个参数必须是表示接口的 class,第二个参数必须是实现该接口的 class 的实例。在这里,您提供了一个 ArrayList
作为第二个参数,这显然不是 ServerInt
的一个实例,这就是您得到此异常的原因。
下面是如何使用此方法的一个很好的示例:
MyRemoteListener listenerImplementation = new MyRemoteListenerImpl();
callHandler.exportObject(MyRemoteListener.class, listenerImplementation);
在这种情况下,第一个参数是接口 MyRemoteListener
,第二个参数是 MyRemoteListenerImpl
的一个实例,它是接口 MyRemoteListener
.
的一个实现
要暴露你的 List
你可以试试 callHandler.registerGlobal(List.class, list)
我正在运行在 Raspberry Pi
和 Android-App
智能手机上编写 Java 程序。该应用程序应该能够在 Raspi
上调用方法 运行ning。
由于 Android
不包含标准 Java RMI 包,我使用 LipeRMI
: http://lipermi.sourceforge.net/
到目前为止一切顺利,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)
第一个参数必须是表示接口的 class,第二个参数必须是实现该接口的 class 的实例。在这里,您提供了一个 ArrayList
作为第二个参数,这显然不是 ServerInt
的一个实例,这就是您得到此异常的原因。
下面是如何使用此方法的一个很好的示例:
MyRemoteListener listenerImplementation = new MyRemoteListenerImpl();
callHandler.exportObject(MyRemoteListener.class, listenerImplementation);
在这种情况下,第一个参数是接口 MyRemoteListener
,第二个参数是 MyRemoteListenerImpl
的一个实例,它是接口 MyRemoteListener
.
要暴露你的 List
你可以试试 callHandler.registerGlobal(List.class, list)