【问题标题】:Java RMI timeoutJava RMI 超时
【发布时间】:2016-05-26 23:10:00
【问题描述】:

我使用 Java RMI 编写了一个客户端/服务器应用程序。当我在本地运行此应用程序时(客户端和服务器中的 IP 字符串都设置为本地 IP),脚本运行良好。

客户代码:

public class ClientMain {
public static void main(String[] args) {


    String ip = "123.123.123.123"; // (my server's IP)


    IUserHandler userHandler;
    try {
        userHandler = (IUserHandler) Naming.lookup("//"+ip+"/Server");
        System.out.println(userHandler.attachUser(new User("John")));
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

服务器代码:

public class MainServer {
public static void main(String[] args) {

    String ip = "123.123.123.123"; // (my server's IP)

    System.out.println("Start Server at " + ip);
    try {
        System.setProperty("java.rmi.server.hostname",ip);
        LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
        Naming.rebind("Server",new UserHandler());

        System.out.println("Server is running");
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }   
}
}

现在是User和UserHandler的接口和类,传输到服务器:

界面 IUser:

public interface IUser extends Remote {
   public String getUserName() throws RemoteException;
   public void setUserName(String name) throws RemoteException;
}

接口 IUserHandler:

public interface IUserHandler extends Remote {
   public int attachUser(IUser user) throws RemoteException;
   public int detachUser(String name) throws RemoteException;
}

类 UserHandler:

public class UserHandler extends UnicastRemoteObject implements IUserHandler {  
public UserHandler() throws RemoteException {}

@Override
public int attachUser(IUser user) throws RemoteException {
    System.out.println(user.getUserName() + " logged in");  
    return 1;
}

@Override
public int detachUser(String name) throws RemoteException{
    return 1;
}
}

班级用户:

public class User extends UnicastRemoteObject implements IUser {
private String name;

public User(String name) throws RemoteException {
    super();
    this.name = name;
}

@Override
public String getUserName() {
    return name;
}

@Override
public void setUserName(String name) {
    this.name = name;
}

}

服务器应用程序应在 Windows Server 2012 机器上运行。当我在服务器上运行生成的 jar 时,它可以正常启动。

因此,在 UserHandler 类中有以下行:

System.out.println(user.getUserName() + " logged in");  

当只打印一个没有任何用户对象的String时,在客户端执行该方法后,打印的行会出现提示。
当仅打印带有用户的 println(但没有方法调用 getUserNAme())时,需要 10-15 秒才能打印。 使用上述语句,没有任何反应,我得到一个超时异常。

在测试环境中,我开启了TCP的所有端口,以确保消息到达。

有人可以帮帮我吗?谢谢!

【问题讨论】:

    标签: java server timeout client rmi


    【解决方案1】:

    您正在使用回调,这意味着您正在打开与客户端的连接,这意味着必须打开客户端的防火墙。

    我强烈建议您摆脱回调并将User 设为可序列化对象。

    【讨论】:

    • 感谢您的回复。我都尝试过,扩展 User Serializable 和 IUser 接口。我之前删除了“扩展 UnicastRemoteObject”。现在我收到以下错误:java.rmi.ServerException:RemoteException 在服务器线程中发生;嵌套异常是:java.rmi.UnmarshalException:错误解组参数;嵌套异常是: java.lang.ClassNotFoundException: User at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:354) 我没有触及其他类。我做错了什么?
    • 信息够清楚了。未部署名为的类。部署它。
    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2018-10-31
    • 2011-06-26
    相关资源
    最近更新 更多