我有两台服务器通过RMI相互通信。我正试图在localhost上测试但是抛出了这个错误。
我尝试使用System.setProperty("java.rmi.server.hostname", IP);
和System.setProperty("java.rmi.server.hostname","localhost");
,但我仍然遇到此错误。
我不知道为什么这些服务器会发生这种情况,因为我有其他服务器通过RMI与ProxyServer或DatanodeServer进行通信,并且不会抛出此错误。
ProxyServer.java
public class ProxyServer implements Proxy {
private static int port = 7001;
public static void main(String[] args) {
try {
String IP = localIP();
System.setProperty("java.rmi.server.hostname", IP);
ProxyServer obj = new ProxyServer();
Proxy stub = (Proxy) UnicastRemoteObject.exportObject(obj, port);
Registry registry = LocateRegistry.createRegistry(port);
registry.bind("Proxy", stub);
System.out.println("Server ready!");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
@Override
public void create(String file, String text) {
try {
Registry namenodeRegistry = LocateRegistry.getRegistry("localhost", NamenodeServer.getPort());
Namenode namenodeStub = (Namenode) namenodeRegistry.lookup("Namenode");
namenodeStub.addFile(file);
int id = getDatanodeID(file);
Registry datanodeRegistry = LocateRegistry.getRegistry("localhost", 5000 + id);
Datanode datanodeStub = (Datanode) datanodeRegistry.lookup("Datanode" + String.valueOf(id));
datanodeStub.create(file, text);
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
// other methods
DatanodeServer.java
public class DatanodeServer implements Datanode {
private int port;
private int id;
public DatanodeServer(int id) {
this.id = id;
this.port = 5000 + id;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Datanode id: ");
int id = sc.nextInt();
try {
System.setProperty("java.rmi.server.hostname", "192.168.1.2");
DatanodeServer obj = new DatanodeServer(id);
Datanode stub = (Datanode) UnicastRemoteObject.exportObject(obj, obj.getPort());
Registry registry = LocateRegistry.createRegistry(obj.getPort());
registry.rebind("Datanode" + String.valueOf(id), stub);
System.out.println("Servidor pronto!");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
// Create file
@Override
public void create(String fileName, String text) {
Path file = Paths.get("datanode" + String.valueOf(this.id) + "/" + fileName); // Converte uma String em um Path
Charset charset = Charset.forName("UTF-8");
try (BufferedWriter writer = Files.newBufferedWriter(file, charset, StandardOpenOption.CREATE)) {
writer.write(text, 0, text.length());
Registry proxyRegistry = LocateRegistry.getRegistry("localhost", ProxyServer.getPort());
Proxy proxyStub = (Proxy) proxyRegistry.lookup("Proxy");
proxyStub.sendToClient("Arquivo " + fileName + ".txt criado!");
} catch (IOException x) {
System.err.format("IOException: %s%n", x);
} catch (NotBoundException e) {
e.printStackTrace();
}
}
// other methods
在proxy.ProxyServer.create处错误 - 65:Datanode datanodeStub =(Datanode)datanodeRegistry.lookup(“Datanode”+ String.valueOf(id));
java.rmi.ConnectException: Connection refused to host: localhost; 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.newCall(UnicastRef.java:338)
at sun.rmi.registry.RegistryImpl_Stub.lookup(RegistryImpl_Stub.java:112)
at proxy.ProxyServer.create(ProxyServer.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:211)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 22 more
答案 0 :(得分:0)
您必须将createRegistry()
的结果存储在静态变量中。否则它可以被垃圾收集。