Ява.нет.Исключения connectexception:Соединение отклонено при вызове SocketChannel.open
Вопрос
Я пытаюсь написать простую программу для открытия канала сокета по локальному адресу.Всякий раз, когда я запускаю эту программу, я получаю исключение "отказано в подключении"
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();
}
}
}
Исключение, которое я получаю, это
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)
Я сталкиваюсь с этой проблемой с Sun Solaris и HP - UX.Кажется, это нормально работает на компьютере с Linux.Кто-нибудь может сообщить мне, почему в подключении отказано?Я выполнил netstat -a и подтвердил, что порт не используется.
Заранее спасибо!
Решение
Из Javadoc для SocketChannel.connect()
Если этот канал находится в неблокирующем режиме, то вызов этого метода инициирует неблокирующую операцию подключения.Если соединение устанавливается немедленно, как это может произойти при локальном соединении, то этот метод возвращает true.В противном случае этот метод возвращает false, и операция подключения должна быть позже завершена вызовом метода finishConnect.
Когда я запускаю ваш код в Linux, функция connect() возвращает false, следовательно, исключений нет.Если вы добавите вызов в SocketChannel.finishConnect(), вы увидите то же исключение отказа в подключении, что и в Solaris / HP-UX.
Я подозреваю, что в Solaris / HP-UX connect() возвращает true, следовательно, исключение выдается немедленно.
Другие советы
Сообщение "Соединение отклонено" - это то, что вы получите, когда на указанном вами порту (19015) не будет прослушивания процесса.Похоже, вы пытаетесь подключиться к сервису, которого там нет.netstat даже сообщает вам, что порт не используется!