Newsgroup: it.comp.java
Titolo: RMI: gestione socket

Ciao a tutti,
sto scrivendo una semplice applicazione RMI, 
la quale funziona bene se eseguita su computer configurati con un solo
indirizzo ip.
Ora ho due computer (A e B per semplicità) con due schede di rete
ciascuno e con i seguenti indirizzi ip:
A ->  129.178.1.13 - 129.178.3.13 (netmask ffffff00)
B ->  129.178.1.103 - 129.178.3.103 (netmask ffffff00)
questi computer sono connessi solo sulla lan 129.178.3.x (per esempio
su B "ping 129.178.1.13" fallisce).
Se l'RMIServer viene eseguito sul computer A e l'RMIClient sul
computer B,
dapprima l'RMIClient ottiene un reference remoto ad un oggetto
sull'RMIServer,
ma se l'RMIClient invoca un metodo dell'oggetto remoto sono lanciate
delle eccezioni.
Ecco cosa succede durante l'esecuzione:
******** Begin ******************
A> java EchoRMIServer 1500 // Quando eseguo l'RMIServer su A
LocalHost 129.178.1.13
Listening on port 1500
**************************
B> java EchoRMIClient 129.178.3.13 1500 // Quando eseguo l'RMIClient
su B
LocalHost 129.178.1.103
I'm connected to Server 129.178.3.13 on port 1500
Write a message [q to exit]: Hello
java.rmi.ConnectException: Connection refused to host: 129.178.1.13;
nested exception is:
        java.net.ConnectException: Connection timed out
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:567)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:101)
        at EchoRMIServer_Stub.getEcho(Unknown Source)
        at EchoRMIClient.main(EchoRMIClient.java:22)
Caused by: java.net.ConnectException: Connection timed out
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:295)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:161)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:148)
        at java.net.Socket.connect(Socket.java:425)
        at java.net.Socket.connect(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:290)
        at java.net.Socket.<init>(Socket.java:118)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:122)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:562)
        ... 5 more
 
******** END ********************
Noto che per B localhost è dato da 129.178.1.103 e l'eccezione è
"Connection refused to host: 129.178.1.13",
e penso che l'RMI tenta di creare un socket tra 129.178.1.13 e
129.178.3.103. La mia domanda è:
come posso creare socket tra 129.178.3.13 e 129.178.3.103 ?
Grazie per l'aiuto!
Paolo
***********************************
Il codice:
/* EchoInterface.java */
import java.rmi.*;
public interface EchoInterface extends Remote{
	public String getEcho(String echo) throws RemoteException,
java.net.UnknownHostException;
}
*******************************
/* EchoRMIServer.java */
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;
public class EchoRMIServer extends UnicastRemoteObject implements
EchoInterface {
 
	private int cont;
	private int port;
	String ip;
 
	public EchoRMIServer (int portNumber) throws RemoteException,
java.net.UnknownHostException {
		super();
		port = portNumber;
 
 
	}
	public String getEcho(String echo) throws RemoteException,
java.net.UnknownHostException{
		String risposta = new String("I'm Server " +
InetAddress.getLocalHost().getHostAddress() + " and answer: " + echo);
		System.out.println("Remote call to Server number " + ++cont + " -
Listening on port " + port);
		return risposta;
	}
	public static void main(String[] args){
		if(args.length<1){
			System.out.println("java EchoRMIServer <port>");
			System.exit(1);
		}
		try{
			System.out.println("\nLocalHost " +
InetAddress.getLocalHost().getHostAddress());
			Integer integerPort = new Integer(args[0]);
			int porta = integerPort.intValue();
			EchoRMIServer serverRMI = new EchoRMIServer(porta);
			Registry rmiRegistry =
LocateRegistry.createRegistry(serverRMI.port);
			rmiRegistry.rebind("EchoService", serverRMI);
			System.out.println("Listening on port " + serverRMI.port + "\n");
		}
		catch(Exception e){
			e.printStackTrace();
			System.exit(1);
		}
	}
}
*************************************
/* EchoRMIClient.java */
import java.rmi.*;
import java.io.*;
import java.net.*;
public class EchoRMIClient{
	public static void main(String[] args){
 
		if(args.length<2){
			System.out.println("java EchoRMIClient <host> <port>");
			System.exit(1);
		}
		BufferedReader stdIn = new BufferedReader(new
InputStreamReader(System.in));
		try{
			System.out.println("\nLocalHost " +
InetAddress.getLocalHost().getHostAddress());
			EchoInterface serverRMI = (EchoInterface) Naming.lookup("rmi://" +
args[0] + ":" + args[1] + "/EchoService");
			System.out.println("I'm connected to Server " + args[0] + " on port
" + args[1]);
			String message, echo;
			System.out.print("\nWrite a message [q to exit]: ");
			message = stdIn.readLine();
			while(!message.equalsIgnoreCase("q")){
 
				echo = serverRMI.getEcho(message);
				System.out.println(echo);
				System.out.print("Write a message [q to exit]: ");
				message = stdIn.readLine();
 
			}
		}
		catch(Exception e){
			e.printStackTrace();
			System.exit(1);
		}
	}
}

 ha scritto nel messaggio
news:b8e3028.04031...@posting.google.com...


 
