2011-12-14 30 views
-1

我看過文檔,測試,調試...但仍然難倒。時間堆棧溢出!我會設置舞臺,然後描述我的錯誤。java.RMI套接字創建細節?

背景

我有一個RMI客戶端/服務器安裝客戶端時,服務器和rmiregistry的 所有在本地主機上共同生活工作正常。所以然後我打開server.host上的rmiregistry,打開rmi.server.logCalls跟蹤(下面稱爲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

但現在的錯誤:我的下一個語句試圖調用服務器的方法之一

boolean status = server.initConnection(username); 

產生一個IllegalArgumentException:

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) 

我已經跟蹤這調用Java源代碼來調用java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod()

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指定它們會更容易...?

感謝您的任何建議,裏克

+0

http://jdk7src.sourceforge.net/提供了一個src-jdk.zip,它包含Oracle JDK 7中包含的幾乎所有類(在OpenJDK7中都是相同的)。對於JDK 6,您必須獲取JRL源文件(在接受JRL之後)並將它們自己複製到一起... – mihi 2011-12-15 21:58:47

+0

感謝指向sourceforge,mihi上的jdk7src的指針。但我戳穿[鏈接] SE6下載(http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u30-download-1377139.html),並在[鏈接]檔案(http ://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u29-oth-JPR)但是沒有找到源代碼? – rikb 2011-12-15 22:37:15

回答

0

它是構建SocksSocketImpl所以你必須在客戶端指定通過socks.proxyHost/socks.proxyPort無效SOCKS代理主機和端口,或者你有java.rmi中.server.hostname在服務器上設置爲一個奇怪的值。