Ява.нет.Исключения connectexception:Соединение отклонено при вызове SocketChannel.open

StackOverflow https://stackoverflow.com/questions/1073203

  •  21-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать простую программу для открытия канала сокета по локальному адресу.Всякий раз, когда я запускаю эту программу, я получаю исключение "отказано в подключении"

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 даже сообщает вам, что порт не используется!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top