2011-12-14 18 views
-1

私はdoc、testing、debugged ...を見てきましたが、困惑しています。 stackOverflowのための時間!私はステージを設定し、私のエラーを説明します。java.RMIソケットの作成の詳細?

背景

私は、RMIクライアント/クライアント、サーバーとのrmiregistry すべてがローカルホスト上で一緒に住んでたときに正常に動作し、セットアップを切断しています。 rmi.server.logCallsトレースをオンにしてserverHostでrmiregistryを起動します(下記のRegistryTraceと呼ばれます)。サーバコードの重要な部分:私は、サーバーの起動時に

String hostname = "//serverHost.local/project" 
String codeBase = "file:/home/rik/Code/eclipse/project/bin/" 

System.setProperty("java.rmi.server.hostname", hostname); 
System.setProperty("java.rmi.server.codebase", codeBase); 

Driver server = new Driver(); 
Naming.rebind(hostname, server); 

、私は再バインド()呼び出しは(RegistryTraceを見ることで)成功ご覧ください。また、Naming.list(によって生成されたリスト)を見ると、それは私のクライアントを起動

"//serverHost.local:1099/project" が含まれて示し、それが成功しNaming.lookupを()完了:

server = (ServerInterface)Naming.lookup(serverHost); 

RegistryTraceを見て、私はこのlookup()クエリがサーバーの最後に到達することを確認することができます。

最初のRMIでのエラー

今:

java.lang.IllegalArgumentException: protocol = socket host = null 
at sun.net.spi.DefaultProxySelector.select(DefaultProxySelector.java:151) 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:424) 
at java.net.Socket.connect(Socket.java:529) 
at java.net.Socket.connect(Socket.java:478) 
at java.net.Socket.<init>(Socket.java:375) 
at java.net.Socket.<init>(Socket.java:189) 
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22) 
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128) 
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595) 
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198) 
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184) 
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:110) 
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178) 
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132) 
at $Proxy0.initConnection(Unknown Source) 
at project.client.View2.main(View2.java:651) 

私はこれをトレースしてきました。私の次の文はIllegalArgumentExceptionを生成するサーバーの方法のいずれか

boolean status = server.initConnection(username); 

を呼び出そうとしjava.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod()の呼び出しにJavaソースにダウン

private Object invokeRemoteMethod(Object proxy, 
        Method method, 
        Object[] args) 
throws Exception 
{ 
try { 
    if (!(proxy instanceof Remote)) { 
    throw new IllegalArgumentException(
     "proxy not Remote instance"); 
    } 

    // EXCEPTION OCCURS WITHIN CALL TO ref.invoke() BELOW 
    // 
    return ref.invoke((Remote) proxy, method, args, 
       getMethodHash(method)); 

} catch (Exception e) { 
    if (!(e instanceof RuntimeException)) { 
    Class<?> cl = proxy.getClass(); 
    try { 
     method = cl.getMethod(method.getName(), 
        method.getParameterTypes()); 
    } catch (NoSuchMethodException nsme) { 
     throw (IllegalArgumentException) 
     new IllegalArgumentException().initCause(nsme); 
    } 
    Class<?> thrownType = e.getClass(); 
    for (Class<?> declaredType : method.getExceptionTypes()) { 
     if (declaredType.isAssignableFrom(thrownType)) { 
     throw e; 
     } 
    } 
    e = new UnexpectedException("unexpected exception", e); 
    } 
    throw e; 
} 
} 

私はソーストレースでそれを失います。 (誰でもsun.rmi.server.UnicastRefのようなソースの可用性に関する話を知っていますか?)残りのトレースは、RMIがソケットを作成できないように見えますか?

私は、このコードの多くの部分がきれいになると確信しています。任意の提案をいただきました。私はまたこれをjarファイル配布に変換する必要があるので、java.rmi.server.codebaseのためにそれらを指定するのがもっと簡単になるでしょう...?任意の提案のための

おかげで、あなたがクライアントでsocks.proxyHost/socks.proxyPort経由で無効SOCKSプロキシホストまたはポートを指定する必要があります、または多分あなたがするjava.rmiを持っているので、それはSocksSocketImplを構築している

+0

http://jdk7src.sourceforge.net/には、Oracle JDK 7に含まれているほぼすべてのクラス(すべてOpenJDK7で同一)を含むsrc-jdk.zipが用意されています。 JDK 6では、JRLソースを取得して(JRLを受け入れた後に)一緒にコピーする必要があります。 – mihi

+0

sourceforge、mihiのjdk7srcへのポインタをありがとう。私は[リンク] SE6のダウンロード(http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u30-download-1377139.html)とat [link]アーカイブ(http ://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u29-oth-JPR)ソースはありませんか? – rikb

+0

http://download.java.net/jdk6/source/は、Java 6の最新の「公式」JRLソースです。それ以降のバージョンでは、たとえば、 http://download.java。net/jdk6/6u30 /をクリックし、ファイル構造をクリックしてください:D – mihi

答えて

0

をRIK .server.hostnameはサーバーで異常な値に設定されています。

+0

EJPに感謝!しかし、同じホスト名を使用しているNaming.lookup()の呼び出しがうまくいくのはどうでしょうか? RMIと同じ値を使用しないのですか? – rikb

+0

@rikbこれは、あなたがルックアップURLで使用するように指示します。リモート・メソッドを呼び出すと、サーバーがスタブに挿入したものが使用されます。これは、java.rmi.server.hostnameの影響を受けます。 – EJP

+0

Naming.list()を使用して、 "//serverHost.local:1099/project"が構築されていることがわかりましたか? – rikb

関連する問題