我看過文檔,測試,調試...但仍然難倒。時間堆棧溢出!我會設置舞臺,然後描述我的錯誤。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指定它們會更容易...?
感謝您的任何建議,裏克
http://jdk7src.sourceforge.net/提供了一個src-jdk.zip,它包含Oracle JDK 7中包含的幾乎所有類(在OpenJDK7中都是相同的)。對於JDK 6,您必須獲取JRL源文件(在接受JRL之後)並將它們自己複製到一起... – mihi 2011-12-15 21:58:47
感謝指向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