Java RMI超时

Java RMI超时,java,server,timeout,client,rmi,Java,Server,Timeout,Client,Rmi,我使用JavaRMI编程了一个客户机/服务器应用程序。当我在本地运行这个应用程序时(客户端和服务器中的IP字符串都设置为本地IP),脚本工作正常 客户端代码: public class ClientMain { public static void main(String[] args) { String ip = "123.123.123.123"; // (my server's IP) IUserHandler userHandler; try {

我使用JavaRMI编程了一个客户机/服务器应用程序。当我在本地运行这个应用程序时(客户端和服务器中的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 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 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());
    }   
}
}
public interface IUser extends Remote {
   public String getUserName() throws RemoteException;
   public void setUserName(String name) throws RemoteException;
}
public interface IUserHandler extends Remote {
   public int attachUser(IUser user) throws RemoteException;
   public int detachUser(String name) throws RemoteException;
}
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;
}

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

接口IUser:

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());
    }   
}
}
public interface IUser extends Remote {
   public String getUserName() throws RemoteException;
   public void setUserName(String name) throws RemoteException;
}
public interface IUserHandler extends Remote {
   public int attachUser(IUser user) throws RemoteException;
   public int detachUser(String name) throws RemoteException;
}
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;
}

}
接口IUserHandler:

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());
    }   
}
}
public interface IUser extends Remote {
   public String getUserName() throws RemoteException;
   public void setUserName(String name) throws RemoteException;
}
public interface IUserHandler extends Remote {
   public int attachUser(IUser user) throws RemoteException;
   public int detachUser(String name) throws RemoteException;
}
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;
}

}
类用户处理程序:

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 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 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());
    }   
}
}
public interface IUser extends Remote {
   public String getUserName() throws RemoteException;
   public void setUserName(String name) throws RemoteException;
}
public interface IUserHandler extends Remote {
   public int attachUser(IUser user) throws RemoteException;
   public int detachUser(String name) throws RemoteException;
}
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");  
仅打印不带任何用户对象的字符串时,在客户端执行该方法后,打印行将显示提示。
当只打印带有用户的println(但没有方法调用getUserNAme())时,需要10-15秒才能打印。 在上面的语句中,什么也没有发生,我得到一个超时异常

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


有人能帮我吗?谢谢大家!

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


我强烈建议您放弃回调,将
User
设置为可序列化对象。

谢谢您的回复。我已经尝试了这两种方法,扩展了User Serializable和IUser接口。我之前删除了“扩展UnicastRemoteObject”。现在我得到了以下错误:java.rmi.ServerException:RemoteException发生在服务器线程中;嵌套的异常是:java.rmi.UnmarshalException:error unmarshalling参数;嵌套异常是:java.lang.ClassNotFoundException:User at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:354)我没有接触其他类。我做错了什么?信息很清楚。未部署名为的类。部署它。