私はイタリア人なので、英語が下手で申し訳ありません。
Java で RMI プログラムを作成しています。これは、RMI サーバーに接続するためのノードのコードのセクションです。
try
{//trying to connect to the Server
Remote RemoteObject;
BootstrapServer_Interface serverObject;
Registry r = LocateRegistry.getRegistry(10001);
RemoteObject = r.lookup("BOOTSTRAP-SERVER");//THIS IS LINE 52
serverObject = (BootstrapServer_Interface)RemoteObject;
//I get an ip as Server's answerw
System.out.println("Il nodo "+Thread.currentThread()+" si mette in attesa");
String ipBN = serverObject.start_join_node(fakeip);
if(ipBN.equals("-1"))
{System.out.println("Creazione del nodo "+Thread.currentThread()+" fallito");
return;
}
ただし、プログラムで次の例外が発生することがあります。
java.rmi.ConnectIOException: Exception creating connection to: 131.114.43.246; nested exception is:
java.net.SocketException: Socket operation on nonsocket: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at StorageNode.run(StorageNode.java:52)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Socket operation on nonsocket: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
... 9 more
そして、これは RMI サーバーに接続するためのクライアントのコードです。
try
{//scelgo casualmente un dato da cercare
//genero il mio indirizzo ip
fakeip = String.valueOf((int) (Math.random() * 256)) + "."
+ String.valueOf((int) (Math.random() * 256)) + "."
+ String.valueOf((int) (Math.random() * 256)) + "."
+ String.valueOf((int) (Math.random() * 256));
//creo una Socket UDP con cui contattare il Nodo di Bootstrap
UDPServiceSocket = scanner.UDPSocket();
if(UDPServiceSocket==null)
{System.out.println("Tentativo di creazione socket UDP fallito...");
*return;}
int UDPport = UDPServiceSocket.getLocalPort();
fakeip=fakeip+" UDPport="+UDPport;
//mi connetto al server tramite RMI
Remote RemoteObject;
Registry r = LocateRegistry.getRegistry(10001);
RemoteObject = r.lookup("BOOTSTRAP-SERVER");//THIS IS LINE 48
serverObject = (BootstrapServer_Interface)RemoteObject;
//Ottengo l'ip del Bootstrap Node a cui connettermi
System.out.println("Il client "+Thread.currentThread()+" si mette in attesa.");
ipBN = serverObject.client_search();
}
そして、この場合の例外(上記で投稿したノード例外と必ずしも一緒に発生するとは限りません)
java.rmi.ConnectIOException: Exception creating connection to: 131.114.43.246; nested exception is:
java.net.SocketException: Socket operation on nonsocket: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at Client.run(Client.java:48)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Socket operation on nonsocket: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
この例外を引き起こす理由が見つかりません。
以前に投稿したコードが少なくて申し訳ありませんが、これは大きなプロジェクトのほんの一部なので、すべてのコードを貼り付けることはできません :D
ただし、必要な場合は、それに関するいくつかの情報を提供できます。
これは DHT プロジェクトであり、Bootstrap サーバー (実際には RMI サーバー) に接続しようとしているときのノード コードです。
RMI サーバー メソッドは、多数のノード (上記のコード) および/または多数のクライアントから同時に呼び出すことができます。
- ノードやクライアントによって呼び出されるサーバー メソッドは、サーバーにインストールされたモニターを管理するために作成されます。
- このモニターを通じて、ノードとクライアントは「ライターとリーダー」のモデル (相互排除など) に従ってハッシュ テーブルを変更します。
この問題で私を助けてくれるすべての人に感謝します。また、私の下手な英語で申し訳ありません!