【发布时间】:2017-02-12 19:25:28
【问题描述】:
3 天后无法解决此问题。 RMI 在 1 或 2 台 PC 上与 localhost 或 192.168.* 一起正常工作,但远程客户端无法使用远程方法。 启动 rmiregisry,然后使用 Naming.rebind() 绑定服务
注册表创建成功,我可以获取绑定服务列表,但我什至无法使用任何方法。
使用
搜索远程服务Naming.lookup("rmi://host_ip:1099/qwe).
or
Registry reg = LocateRegistry.getRegistry("host_ip",server);
reg.lookup("qwe")
客户端找到对象但不能使用它的方法。
代码如下: 服务器.java:
public class Server extends UnicastRemoteObject{
protected Server() throws RemoteException {
}
public static void main(String[] args) throws InterruptedException, RemoteException {
ServiceServerImpl server = new ServiceServerImpl();
try {
System.setProperty("java.rmi.server.hostname", "host_ip");
Naming.rebind("/qwe", server);
Arrays.asList(Naming.list("rmi://localhost")).forEach(System.out::println);
System.out.println(System.getProperty("java.rmi.server.hostname"));
} catch (Exception e) {
e.printStackTrace();
}
server.startServer();
}
}
ServiceServer.java:
public interface ServiceServer extends Remote{
String[] getLoginsList() throws RemoteException;
void addLogin(String login) throws RemoteException;
void removeLogin(String login) throws RemoteException;
boolean canConnect(String login) throws RemoteException;
void setConnected(String login) throws RemoteException;
void setDisconnected(String login) throws RemoteException;
}
ServiceServerImpl.java(如果需要):
public class ServiceServerImpl extends UnicastRemoteObject implements ServiceServer {
private ServerSocket socketListener;
private Socket clientSock;
private volatile List<ClientHandler> threadsList = new ArrayList<ClientHandler>();
private volatile Map<String, Boolean> logins = new HashMap<String,Boolean>();
// private Timer timer;
public ServiceServerImpl() throws RemoteException {
}
public void startServer() {
// startTimer();
try {
socketListener = new ServerSocket(5001);
System.out.println("server up...");
while (true) {
clientSock = null;
while (clientSock == null)
clientSock = socketListener.accept();
ClientHandler curClientHandler = new ClientHandler(clientSock, this);
threadsList.add(curClientHandler);
System.out.println("user connected: " + clientSock.getInetAddress());
}
} catch (Exception e) {
System.err.println("Socket exception");
e.printStackTrace();
}
}
public synchronized void removeUserThread(ClientHandler handler) {
try {
threadsList.remove(handler);
} catch (NullPointerException e) {
}
System.out.println("- 1");
}
@Override
public void setConnected(String login){
logins.put(login,true);
}
@Override
public void setDisconnected(String login){
logins.put(login,false);
}
@Override
public boolean canConnect(String login) throws RemoteException{
return logins.keySet().contains(login)&& (!logins.get(login));
}
@Override
public String[] getLoginsList() throws RemoteException {
return this.logins.keySet().toArray(new String[this.logins.size()]);
}
@Override
public void addLogin(String login) throws RemoteException {
logins.put(login, false);
System.out.println("added");
}
@Override
public void removeLogin(String login) throws RemoteException {
logins.remove(login);
}
public Map<String, Boolean> getLogins() {
return logins;
}
public Set<String> getAllowedLogins() {
return logins.keySet();
}
public List<ClientHandler> getThreadsList() {
return threadsList;
}
}
我用 cmd 或 eclipse 启动 rmiregistry,然后启动服务器。 它正确启动,我无法连接本地主机或 192.168.0。* 但它不适用于远程客户端 尝试使用 .policy 文件 - 仍然不起作用
我得到下一个错误代码:
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: 192.168.0.83; nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at com.sun.proxy.$Proxy0.canConnect(Unknown Source)
at server.Main.main(Main.java:16)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
... 8 more
请帮忙
【问题讨论】:
-
可能您遇到了防火墙或其他设置等连接问题。尝试通过telnet从客户端连接到服务器:telnet server_ip server_port
-
Server不应扩展UnicastRemoteObject。ServiceServerImpl不应该创建套接字。 -
@EJP 已修复..仍然无法正常工作
-
我没说会。它是作为评论发布的,而不是作为答案发布的。
-
请停止从您的问题中删除代码。