我已经在两台机器上启动了rmiregistry,我已经能够成功绑定rmiserver,并且它一直在线程中运行,没有任何异常。然而,当我从其他机器的linux终端通过rmi客户端运行一个方法时,我得到异常(当获得rmiregistry时)无法访问主机。 host是rmiserver正在运行(并且已绑定)的地址
这是我的rmiserver代码
public class MQAgentServer implements MQAgent, Runnable {
public static void main(String[] args) {
getProperties();
System.setProperty("java.security.Policy", "java.security.AllPermission");
System.setProperty("java.rmi.server.hostname", hostName);
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
String name = "RCMQAgent";
MQAgent engine = new MQAgentServer();
MQAgent stub = (MQAgent) UnicastRemoteObject.exportObject(engine, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind(name, stub);
System.out.println("MQAgentServer bound");
} catch (Exception e) {
System.err.println("MQAgentServer exception:");
e.printStackTrace();
}
}
}
这里是rmi客户端代码
public class MQAgentClient {
protected static MQAgent netConn = null;
public static void main(String args[]) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
String resourceType = args[0];
String resourceName = args[1];
String action = args[2];
String hostName = args[3];
System.out.println("EXECUTING COMMAND:INSIDE MQAgentClient.java");
try {
if (hostName != null && !hostName.trim().equals("")) {
Registry registry = LocateRegistry.getRegistry(hostName);
netConn = (MQAgent) registry.lookup(MQAgent.LOOKUPNAME);
}
File file = new File("/home/mpadmin/log/ClientLog.txt");
file.createNewFile();
FileWriter writer = new FileWriter(file);
writer.write(resourceType + resourceName + action + hostName);
if ((resourceType != null && !resourceType.trim().equals("")) && (resourceName != null && !resourceName.trim().equals("")) && (action != null && !action.trim().equals(""))) {
if (resourceType.trim().equals("QueueManager")) {
if (action.trim().equals("Start")) {
netConn.startQMGR(resourceName);
} else if (action.trim().equals("Stop")) {
netConn.stopQMGR(resourceName);
} else {
writer.write("Illegal Arguments");
}
} else if (resourceType.trim().equals("Process")) {
if (action.trim().equals("Start")) {
netConn.startProcess(resourceName);
} else if (action.trim().equals("Stop")) {
netConn.stopProcess(resourceName);
} else {
writer.write("Illegal Arguments");
}
} else if (resourceType.trim().equals("Channel")) {
if (action.trim().equals("Start")) {
netConn.startChannel(resourceName);
} else if (action.trim().equals("Stop")) {
netConn.stopChannel(resourceName);
} else {
writer.write("Illegal Arguments");
}
}else if (resourceType.trim().equals("Configuration")) {
if (action.trim().equals("Fetch")) {
netConn.fetchConfiguration(resourceName);
}else {
writer.write("Illegal Arguments");
}
}
}
writer.flush();
writer.close();
} catch (RemoteException e) {
System.out.println("EXECUTING COMMAND : REMOTE EXCEPTION when getting rmiregistry\n============================");
e.printStackTrace();
} catch (IOException e) {
System.out.println("EXECUTING COMMAND : IO EXCEPTION when creating log file\n=======================");
e.printStackTrace();
} catch (NotBoundException e) {
System.out.println("EXECUTING COMMAND : NotBoundException EXCEPTION when looking up RMIServer in through registry\n=======================");
e.printStackTrace();
} catch (Exception e){
System.out.println("EXECUTING COMMAND : GENERIC EXCEPTION inside MQAgent.java\n=======================");
e.printStackTrace();
}
System.out.println("EXECUTING COMMAND : Command sent to RMI Server successfully");
}
}
这是我用来运行客户端的命令
java -Djava.security.policy=file:/home/<user>/MQAgentClient/client.policy -Djava.rmi.server.codebase=file:/home/<user>/MQAgentClient/bin/ -cp /home/<user>/MQAgentClient/bin;/home/<user>/interface/mqagentinterface.jar com.rc.mqagent.client.MQAgentClient Configuration node0 Fetch <HOST IP WHERE RMISERVER IS RUNNING>
我可能会遗漏一些显而易见的东西,或者我可能没有提供足够的信息,只是帮我解决这个问题并对我轻松,谢谢!
哦,这是响应命令
的例外java.rmi.ConnectException: Connection refused to host: <IP WHERE RMI SERVER IS RUNNING>; nested exception is:
java.net.ConnectException: Connection timed out
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:342)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at com.rc.mqagent.client.MQAgentClient.main(MQAgentClient.java:33)
Caused by: java.net.ConnectException: Connection timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
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)
... 5 more
编辑:
netstat -tulpn
tcp 0 0 :::2426 :::* LISTEN 2283/runmqlsr
tcp 0 0 :::5666 :::* LISTEN -
tcp 0 0 :::1099 :::* LISTEN 1490/./rmiregistry
tcp 0 0 :::111 :::* LISTEN -
udp 0 0 127.0.0.1:963 0.0.0.0:*