私は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を構築している
http://jdk7src.sourceforge.net/には、Oracle JDK 7に含まれているほぼすべてのクラス(すべてOpenJDK7で同一)を含むsrc-jdk.zipが用意されています。 JDK 6では、JRLソースを取得して(JRLを受け入れた後に)一緒にコピーする必要があります。 – mihi
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
http://download.java.net/jdk6/source/は、Java 6の最新の「公式」JRLソースです。それ以降のバージョンでは、たとえば、 http://download.java。net/jdk6/6u30 /をクリックし、ファイル構造をクリックしてください:D – mihi