java.net.ConnectException: Connection refused wenn SocketChannel.open aufgerufen wird
Frage
Ich versuche, ein einfaches Programm zu schreiben, einen Socket-Kanal an einer lokalen Adresse zu öffnen. Ich erhalte eine Verbindung abgelehnt Ausnahme, wenn ich dieses Programm ausführen
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();
}
}
}
Die Ausnahme, die ich erhalte, ist
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)
Ich begegne dieses Problem mit Sun Solaris und HP - UX. Es scheint auf einer Linux-Maschine zu funktionieren. Kann jemand lassen Sie mich wissen, warum die Verbindung abgelehnt wird? Ich habe ein netstat -a und bestätigt, dass der Port nicht verwendet wird.
Vielen Dank im Voraus!
Lösung
Von der Javadoc für SocketChannel.connect ()
Wenn dieser Kanal in non-blocking-Modus ist dann ein Aufruf dieser Methode löst einen nicht blockierende Verbindungsvorgang. Wenn die Verbindung sofort hergestellt wird, wie bei einer lokalen Verbindung passieren kann, gibt diese Methode true. Ansonsten ist diese Methode gibt false zurück und der Verbindungsvorgang muss später durch Aufrufen der finish Verfahren abgeschlossen sein.
Wenn ich den Code auf Linux laufen, connect () gibt false zurück, daher gibt es keine Ausnahme. Wenn Sie einen Anruf zu socketChannel.finishConnect () hinzufügen, sehen Sie die gleiche Verbindung Ausnahme verweigert, wie Sie auf Solaris / HP-UX erhalten.
Ich vermute, dass auf Solaris / HP-UX connect () gibt true zurück, damit die Ausnahme sofort ausgelöst wird.
Andere Tipps
Die „Connection refused“ Nachricht ist, was Sie erhalten werden, wenn kein Prozess auf Ihrem angegeben Port (19015) zu hören ist. Es sieht aus wie Sie versuchen, einen Dienst zu verbinden, die nicht da ist. netstat wird auch Sie sagen, dass der Port nicht verwendet wird!