java.net.ConnectException:Connessione rifiutata quando SocketChannel.aperto viene richiamato
Domanda
Sto cercando di scrivere un semplice programma per aprire un socket canale di un indirizzo locale.Ho una connessione rifiutata eccezione ogni volta che ho eseguito questo programma
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.channels.SocketChannel;
public class testSocket {
public static void main(String [] args) {
try {
InetAddress addr = InetAddress.getByName("localhost");
InetSocketAddress remoteAddress = new InetSocketAddress(addr, 19015);
// Open a new Socket channel and set it to non-blocking
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
// Issue the Connect call on the remote address.
socketChannel.connect(remoteAddress);
} catch (Exception e) {
e.printStackTrace();
}
}
}
L'unica eccezione che mi viene
java.net.ConnectException: Connection refused
at sun.nio.ch.Net.connect(Native Method)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:464)
at testSocket.main(testSocket.java:17)
Ho incontrato questo problema con Sun Solaris e HP - UX.E sembra funzionare bene su una macchina Linux.Qualcuno può farmi sapere perché la connessione viene rifiutata?Ho fatto un netstat-a e ha confermato che la porta non è in uso.
Grazie in anticipo!
Soluzione
Da Javadoc SocketChannel.connect()
Se il canale è in modalità non bloccante quindi un'invocazione di questo metodo avvia un non-blocking funzionamento della connessione.Se la connessione è stabilita immediatamente, come può accadere con una connessione locale, quindi questo metodo restituisce true.Altrimenti questo metodo restituisce false e che l'operazione di connessione devono poi essere completato richiamando il finishConnect metodo.
Quando eseguo il codice su Linux, connect() restituisce false, di conseguenza, non vi è alcuna eccezione.Se si aggiunge una chiamata a socketChannel.finishConnect() si vedrà la stessa connessione rifiutata eccezione, come si ottiene su Solaris/HP-UX.
Ho il sospetto che su Solaris/HP-UX connect() restituisce true, quindi, l'eccezione viene generata immediatamente.
Altri suggerimenti
La "Connection refused" messaggio è quello che riceverai quando non v'è alcun processo in ascolto sulla vostra porta specificata (19015). Sembra che si sta cercando di connettersi a un servizio che non c'è. netstat è addirittura si dice che la porta non è in uso!