2017-07-04 7 views
0

ソケットとRMIとのサーバー通信を使用するゲームを開発しています。私はRMIが新しく、同じPC上にないサーバとクライアントの間で通信しようとする際にいくつかの問題が発生しています。 localhostでは問題なく動作します。そうしないと、期待通りの通信ができません。 ここにいくつかのコードスニペット:Java RMIサーバーとクライアントの通信が動作しない

public RMIServer (ServerInterface mainServer){ 
    this.mainServer = mainServer; 
} 

public void startServer() throws IOException { 
    Registry registry = createOrLoadRegistry(Server.RMIPORT); 
    try { 
     System.out.println("Insert server ip address: "); 
     Scanner in = new Scanner(System.in); 
     String address = in.nextLine(); 
     in.close(); 
     System.setProperty("java.rmi.server.hostname", address); 
     registry.bind("RMIServerInterface", this); 
     UnicastRemoteObject.exportObject(this, Server.RMIPORT+1); 
    } catch (RemoteException | AlreadyBoundException e) { 
     System.err.println(e.getMessage()); 
    } 
}  

private Registry createOrLoadRegistry(int port) throws IOException{ 
    try { 
     System.out.println("creating register.. "); 
     return LocateRegistry.createRegistry(port); 
    } catch (RemoteException e) { 
     System.err.println(e.getMessage()); 
    } 
    try { 
     return LocateRegistry.getRegistry(port); 
    } catch (RemoteException e) { 
     System.err.println(e.getMessage()); 
    } 
    return null; 
} 

ソケットではなく、非常に良い作品。

EDIT: 私が使用することを余儀なくされた最初の場所でRMIの仕事をできるように:

System.setProperty("java.rmi.server.hostname") 

enter code here 

サーバーIPがランダムに127.0.1.1(ループバック)に設定されたため。 私は、サーバー側のスタックのトラックを印刷し、これは結果だった:あなたは間違った順序ですべてをやっている

creating register.. 
Insert server ip address: 
192.168.1.73 
Socket server is ready 
Recieved RMI client connection 
create first room.. 
cchvo has been added to room 
Number of players: 1 
java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is: 
    java.net.ConnectException: Connessione rifiutata (Connection refused) 
    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.invoke(UnicastRef.java:130) 
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227) 
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179) 
    at com.sun.proxy.$Proxy1.notifyNewPlayer(Unknown Source) 
    at server.RMIPlayer.notifyNewPlayer(RMIPlayer.java:28) 
    at server.Room.notifyNewPlayer(Room.java:147) 
    at server.Room.addPlayer(Room.java:106) 
    at server.Server.createRoom(Server.java:98) 
    at server.Server.addPlayerFirstAvailableRoom(Server.java:119) 
    at server.RMIServer.addRoom(RMIServer.java:82) 
    at server.RMIServer.loginPlayer(RMIServer.java:75) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346) 
    at sun.rmi.transport.Transport$1.run(Transport.java:200) 
    at sun.rmi.transport.Transport$1.run(Transport.java:197) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:748) 
Caused by: java.net.ConnectException: Connessione rifiutata (Connection refused) 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    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) 
    ... 30 more 
+0

* "...通信は期待どおりに動作しません" *: (クライアントまたはサーバー側で)どこでエラーが発生しますか? どのようなエラーが出ますか(スタックトレースは例外です)? 'System.err.println(e.getMessage())'の代わりに 'e.printStackTrace()'を使うと助けになります。 –

+0

投稿のサーバー側にstackTraceを追加しました。 – user603334

答えて

0

  1. セットjava.rmi.server.hostname
  2. リモートオブジェクトをエクスポートします。
  3. レジストリを作成します。
  4. リモートオブジェクトをレジストリにバインドします。
+0

それは役に立たなかった。ありがとう – user603334

0

私はあまりにも、クライアントに

System.setProperty ("java.rmi.server.hostname", clientIp) 

を追加することによってこの問題を解決するために、最終的に管理しました。同じ問題を持つ人を助けることを願っています。

PS:3つ以上のPC(Debianを使用)がhostnameにこの問題を抱えていましたが、UbuntuとWindowsを実行していた他のPCはそうではありませんでした。 答えをありがとう。

関連する問題