在服務器中,我運行帶有RMI服務器jar文件的docker容器。 我已經嘗試了幾種不同的配置,但我不能讓它工作。 我Serverside集團:Docker容器中的Java RMI服務器
public class Main extends UnicastRemoteObject implements RmiServerIntf {
public static final String MESSAGE = "Hello World from docker in RMI";
public Main() throws RemoteException {
super(0); // required to avoid the 'rmic' step, see below
}
public String getMessage() {
return MESSAGE;
}
public static void main(String args[]) throws Exception {
System.out.println("RMI server started");
System.setProperty("java.rmi.server.hostname", "<host-ip-address>");
try { //special exception handler for registry creation
LocateRegistry.createRegistry(1099);
System.out.println("java RMI registry created.");
} catch (RemoteException e) {
LocateRegistry.getRegistry();
System.out.println("java RMI registry already exists.");
}
//Instantiate RmiServer
Main obj = new Main();
// Bind this object instance to the name "RmiServer"
Naming.rebind("RmiServer", obj);
System.out.println("PeerServer bound in registry");
}
}
我的客戶:
public class Main {
public Main() {
}
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
RmiServerIntf obj = (RmiServerIntf) Naming.lookup("rmi://<my-host-address>:4023/RmiServer");
System.out.println(obj.getMessage());
}
}
,他們都共享 「RmiServerIntf」
我Dockerfile:
FROM ubuntu:latest
RUN回聲 「更新ubuntu的圖像」 RUN易於得到更新& &易於得到安裝-y \ 的openjdk -8- JRE EXPOSE 1099 COPY RMIServer.jar /home/RMIServer.jar CMD [的 「java」, 「罐子」, 「/home/RMIServer.jar」]
(對不起,它不會格式化右)
我開始我的容器: 搬運工運行--name rmitest -d -p 4023:1099 rmitestimage
客戶拋出我:
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: <my-host-address>; nested exception is:
java.net.ConnectException: Connection refused (Connection refused)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179)
at com.sun.proxy.$Proxy0.getMessage(Unknown Source)
at com.company.Main.main(Main.java:19)
'LocateRegistry.getRegistry();'的成功執行並不能證明註冊表存在,因爲它不執行任何網絡操作。如果你調用'LocateRegistry.createRegistry()',你必須將結果存儲到一個靜態變量中。 – EJP