この質問が何度か寄せられていることは知っていますが、自分に合った答えをまだ見つけていません。基本的に、RMI を使用してクライアント/サーバー ソリューションを実装しました。私の唯一の問題は、サーバーへの接続が非常に遅い場合があることです。
サーバーが起動してクライアントが接続すると、初めて接続されるまでに数秒かかります (接続さえせず、代わりに ConnectException を取得する場合があります)。その後、通信しようとすると接続が拒否されます。サーバー。さらに気が遠くなるようなことは、最初に失敗したクライアントを切断して再度接続すると、完全に正常に動作することです。その後、クライアントは 1 秒以内に接続し、すべての通信が問題なく機能します。
rmiregistry を手動で開始しようとしましたが、PATH を再確認しました。telnet でポートに接続できませんでしたが、そのポートで Othello ゲーム (RMI を使用していない) をプレイすると機能します。同じネットワークとコンピューターでこれを行っているため、ローカルホストを使用していると言う価値があるかもしれません。
TL;DR: 最初にサーバーに接続するときは永遠に時間がかかりますが、接続できます。その後、メソッドと通信しようとするとクラッシュし、「java.rmi.ConnectException: 接続がホストへの接続を拒否しました: 192.xxx.xxx.x; ネストされた例外は: java.net.ConnectException: 接続がタイムアウトしました: 接続」を受け取ります。その後、そのクライアントを閉じて別のクライアントに接続しようとすると、接続に約 1 秒かかり、すべて問題なく動作します。何故ですか?
クライアントのコード:
public class NetworkClient {
private Registry registry;
private IArenaServer server;
public NetworkClient(String ipAddress, int port) throws RemoteException {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
registry = LocateRegistry.getRegistry(ipAddress, port);
server = (IArenaServer)(registry.lookup("arenaServer"));
System.out.println("Client successfully connected to server at " + ipAddress + ":" + "port");
} catch (NotBoundException ex) {
Logger.getLogger(NetworkClient.class.getName()).log(Level.SEVERE, null, ex);
} catch (AccessException ex) {
Logger.getLogger(NetworkClient.class.getName()).log(Level.SEVERE, null, ex);
}
}
サーバーのコード:
public class ArenaServer extends UnicastRemoteObject implements IArenaServer {
private int port = 9029;
private String ipAddress;
private Registry registry;
public ArenaServer() throws RemoteException {
if(System.getSecurityManager() == null){
System.setSecurityManager(new RMISecurityManager());
}
// try {
//ipAddress = (InetAddress.getLocalHost()).toString();
registry = LocateRegistry.createRegistry(port);
registry.rebind("arenaServer", this);
System.out.println("Server successfully started...");
//System.out.println("Server's IP address is: " + ipAddress);
// } catch (UnknownHostException ex) {
// ErrorHandler.getInstance().reportError("Cannot get IP address", "");
// }
}
初めて接続した後にサーバーと通信しようとしたときに得られるものの一般的な例:
java.rmi.ConnectException: Connection refused to host: 192.xxx.xxx.x; 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 $Proxy0.getInstalledGames(Unknown Source)
....