java.net.ConnectException: соединение отказано

186

Я пытаюсь реализовать TCP-соединение, все отлично работает со стороны сервера, но когда я запускаю клиентскую программу (с клиентского компьютера), я получаю следующую ошибку:

java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)
        at TCPClient.main(TCPClient.java:13)

Я попытался изменить номер сокета, если он использовался, но безрезультатно, кто-нибудь знает, что вызывает эту ошибку и как ее исправить.

Код сервера:

//TCPServer.java

import java.io.*;
import java.net.*;

class TCPServer {
    public static void main(String argv[]) throws Exception {
        String fromclient;
        String toclient;

        ServerSocket Server = new ServerSocket(5000);

        System.out.println("TCPServer Waiting for client on port 5000");

        while (true) {
            Socket connected = Server.accept();
            System.out.println(" THE CLIENT" + " " + connected.getInetAddress()
                    + ":" + connected.getPort() + " IS CONNECTED ");

            BufferedReader inFromUser = new BufferedReader(
                    new InputStreamReader(System.in));

            BufferedReader inFromClient = new BufferedReader(
                    new InputStreamReader(connected.getInputStream()));

            PrintWriter outToClient = new PrintWriter(
                    connected.getOutputStream(), true);

            while (true) {

                System.out.println("SEND(Type Q or q to Quit):");
                toclient = inFromUser.readLine();

                if (toclient.equals("q") || toclient.equals("Q")) {
                    outToClient.println(toclient);
                    connected.close();
                    break;
                } else {
                    outToClient.println(toclient);
                }

                fromclient = inFromClient.readLine();

                if (fromclient.equals("q") || fromclient.equals("Q")) {
                    connected.close();
                    break;
                } else {
                    System.out.println("RECIEVED:" + fromclient);
                }

            }

        }
    }
}

Код клиента:

//TCPClient.java

import java.io.*;
import java.net.*;

class TCPClient {
    public static void main(String argv[]) throws Exception {
        String FromServer;
        String ToServer;

        Socket clientSocket = new Socket("localhost", 5000);

        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
                System.in));

        PrintWriter outToServer = new PrintWriter(
                clientSocket.getOutputStream(), true);

        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
                clientSocket.getInputStream()));

        while (true) {

            FromServer = inFromServer.readLine();

            if (FromServer.equals("q") || FromServer.equals("Q")) {
                clientSocket.close();
                break;
            } else {
                System.out.println("RECIEVED:" + FromServer);
                System.out.println("SEND(Type Q or q to Quit):");

                ToServer = inFromUser.readLine();

                if (ToServer.equals("Q") || ToServer.equals("q")) {
                    outToServer.println(ToServer);
                    clientSocket.close();
                    break;
                } else {
                    outToServer.println(ToServer);
                }
            }
        }
    }
}
Саманта Катания
источник
Можете ли вы опубликовать код клиента? Если это удаленный клиент, убедитесь, что у вас нет проблем с брандмауэром!
дома
Я отключил брандмауэры как на клиенте, так и на сервере, и все еще с той же проблемой
Саманта Катания
2
Какой интерфейс слушает сервер. Если вы слушаете только локальный хост, вы не можете подключиться удаленно.
Торбьерн Равн Андерсен
Я пытался подключиться удаленно, используя localhost, face palm. Это моя первая пробная версия с TCP>. <Как сделать так, чтобы она работала удаленно?
Саманта Катания
Помните, что у вас могут быть некоторые «железные» аппаратные брандмауэры между ними ... Работает ли это, если клиент и сервер находятся в одной коробке?
дома

Ответы:

323

Это исключение означает, что нет службы, прослушивающей IP / порт, к которому вы пытаетесь подключиться:

  • Вы пытаетесь подключиться к неправильному IP / хосту или порту.
  • Вы не запустили свой сервер.
  • Ваш сервер не прослушивает соединения.
  • На серверах Windows очередь прослушивания невыполнена.
Коллин Прайс
источник
52
Я чувствую себя глупым из-за того, что упустил из виду You have not started your server, но это действительно было проблемой для меня!
Алексис Леклерк,
Просто чтобы прояснить суть - «ядро Java просто отлично». Единственная проблема заключается в том, что мы упускаем из виду проблемы (состояние сервера, IP-адрес, порт, подключение к Интернету - для локальных IP-адресов и т. Д. Необходимо находиться на одном и том же маршрутизаторе)
Vinay Bhargav
1
Коллин, что именно ты подразумеваешь под словом «сервер не ждет приема соединений»? Люди попугают вокруг, как будто это что-то значит.
Маркиз Лорн
Я написал это некоторое время назад, но, думаю, я имел в виду, что вы еще не запустили свой сервер.
Коллин Прайс
в моем случае у меня было четыре симулятора Gennymotion, и я пытался загрузить приложение на вкладке Galaxy, и я получал эту ошибку. после прочтения большого количества информации из WEB-партнера, я закрыл все симуляторы и затмение, убил ADP в диспетчере задач, а затем перезапустил Eclipse, и все стало работать нормально. Я думаю, что когда у вас работает несколько симуляторов, а затем вы пытаетесь подключить устройство, ADB сходит с ума в моем опыте. это мои два цента ... :)
Винси
40

Я бы проверил:

  • Имя хоста и порт, к которому вы пытаетесь подключиться
  • На стороне сервера удалось начать слушать правильно
  • Там нет брандмауэра, блокирующего соединение

Простейшая отправная точка, вероятно, состоит в том, чтобы попытаться подключиться вручную с клиентского компьютера, используя telnet или Putty. Если это успешно, то проблема в вашем клиентском коде. Если это не так, вам нужно понять, почему это не так. Wireshark может помочь вам в этом.

Джон Скит
источник
Иногда я получаю это исключение. Это происходит в течение определенного периода времени. Это сразу бросает это исключение. И тогда все становится хорошо. У меня есть брандмауэр на сервере. Но я добавил правило для входящих подключений, разрешающее входящие подключения через порт 8080. Иногда это правило игнорируется?
Эшвин
@ Эшвин: Невозможно сказать, на самом деле - вам нужно будет точно определить, как далеко идут данные. Посмотрите журналы вашего брандмауэра и т. Д.
Джон Скит
@JonSkeet, как настроить наш брандмауэр, если у нас есть эта ошибка?
Нихил Парик
1
@Nikhil: Я не квалифицирован , чтобы ответить на этот вопрос, но я подозреваю , что кто -то, кто является квалифицированным будет нужно гораздо больше информации , чтобы быть в состоянии помочь вам. (Во-первых, мы не знаем, какой у вас брандмауэр ...)
Джон Скит,
7

Вы должны подключить свой клиентский сокет к удаленному ServerSocket. Вместо того

Socket clientSocket = new Socket("localhost", 5000);

делать

Socket clientSocket = new Socket(serverName, 5000);

Клиент должен подключиться к serverName, которое должно совпадать с именем или IP-адресом ящика, на котором ServerSocketбыл создан ваш экземпляр (имя должно быть доступно с клиентского компьютера). Кстати: это не имя, которое важно, это все об IP-адресах ...

домой
источник
Я предполагаю, что она запускает их обоих на одной машине для тестирования, поэтому локальный хост будет в порядке
SE
@ Аарон: Она сказала, что это работает, если клиент и сервер работают на одном компьютере (ответ вы можете найти в другом комментарии).
дома
«Вышеуказанная строка связывает сокет с localhost» Нет, это не так, он связывает его с INADDR_ANY. Это позволяет ему принимать соединения через любой сетевой адаптер. То, что делает ОП, уже правильно. Ответ совершенно неверный. Downvoting.
маркиз Лорн
@EJP: Вы правы ServerSocket, я изменил ответ. Тем не менее, clientSocketвсе еще пытается подключиться к localhost.
дома
@home Вам нужно удалить фразу об адресе привязки.
маркиз Лорн
7

У меня была такая же проблема, но запуск Сервера до запуска Клиента исправил ее.

Дао Лам
источник
4
Конечно, вы должны запустить сервер перед клиентом. Первый запуск клиента и попытка подключения к серверу означает, что вы подключаетесь ни к чему, когда запускаете сервер.
user3308043
5
@ user3308043 Да, это было очевидно, но это не было слишком очевидно для некоторых новых программистов (таких как я 3 года назад), поэтому я просто хотел поделиться этим с теми парнями, которые были невежественны, как я.
Дао Лам
Спасибо, это также помогло мне, тестовое соединение было успешным, но не смог показать данные таблиц.
Дэмиен Кристоф
6

Один момент, который я хотел бы добавить к ответам выше, это мой опыт -

«Я размещался на своем сервере на локальном хосте и пытался подключиться к нему через эмулятор Android , указав правильный URL-адрес, например http://localhost/my_api/login.php. И я получаю сообщение об ошибке « Отказано в соединении »»

Обратите внимание: когда я просто зашел в браузер на ПК и использовал тот же URL ( http://localhost/my_api/login.php), я получил правильный ответ

поэтому проблема в моем случае заключалась в том, localhostчто я заменил IP-адрес моего сервера (поскольку ваш сервер размещен на вашем компьютере), что сделало его доступным из моего эмулятора на том же ПК.


Чтобы получить IP для вашего локального компьютера, вы можете использовать ipconfigкоманду на cmd, вы получите IPv4 что-то вроде 192.68.xx.yy Voila. Это IP вашего компьютера, на котором размещен ваш сервер. используйте его вместо localhost

http://192.168.72.66/my_api/login.php


Примечание. Вы не сможете получить доступ к этому частному IP-адресу ни с одного узла за пределами этого компьютера. (Если вам нужно, вы можете использовать Ngnix для этого)

eRaisedToX
источник
4

У меня была такая же проблема с брокером Mqtt под названием vernemq.but решил ее, добавив следующее.

  1. $ sudo vmq-admin listener show

показать список разрешенных ips и портов для vernemq

  1. $ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000

добавить любой ip и ваш новый порт. Теперь вы можете подключиться без проблем.

Надеюсь, это решит вашу проблему. введите описание изображения здесь

MrOnyancha
источник
1
Это спасло мой день, но поскольку vernemq не устанавливается с помощью apt-get, некоторым людям понадобится эта ссылка: vernemq.com/docs/installation/debian_and_ubuntu.html
Дамир Олехар,
2

Надеюсь, мой опыт может быть полезным для кого-то. Я столкнулся с проблемой с той же трассировкой стека исключений, и я не мог понять, в чем проблема. Сервер базы данных, к которому я пытался подключиться, работал, и порт был открыт и принимал подключения.

Проблема была с подключением к интернету. Подключение к Интернету, которое я использовал, не позволяло подключиться к соответствующему серверу. Когда я изменил детали подключения, проблема была решена.

Феникс
источник
1

В моем случае я дал сокету имя сервера (в моем случае «raspberrypi»), и вместо этого его создал IPv4-адрес, или, чтобы указать, IPv6 был сломан (имя было преобразовано в IPv6).

Zhyano
источник
1

В моем случае я должен был поставить галочку рядом Expose daemon on tcp://localhost:2375 without TLSс dockerнастройкой (в правой части панели задач, щелкните правой кнопкой мыши docker, выберите setting)

user1419243
источник
1

я получил эту ошибку, потому что я закрыл ServerSocket внутри цикла for, который пытается принять количество клиентов внутри него (я не закончил принимать все клины)

так что будьте осторожны, где закрыть сокет

Башир Аль-Момани
источник
0

У меня была та же проблема, и проблема была в том, что я не закрывал объект сокета. После использования socket.close (); задача решена. Этот код работает для меня.

ClientDemo.java

public class ClientDemo {
    public static void main(String[] args) throws UnknownHostException,
            IOException {
        Socket socket = new Socket("127.0.0.1", 55286);
        OutputStreamWriter os = new OutputStreamWriter(socket.getOutputStream());
        os.write("Santosh Karna");
        os.flush();
        socket.close();
    }
}

и ServerDemo.java

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        System.out.println("server is started");
        ServerSocket serverSocket= new ServerSocket(55286);
        System.out.println("server is waiting");
        Socket socket=serverSocket.accept();
        System.out.println("Client connected");
        BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String str=reader.readLine();
        System.out.println("Client data: "+str);
        socket.close();
        serverSocket.close();

    }
}
Сантош Карна
источник
1
Не закрытие клиентского сокета не приводит к отказу соединения. Не было бы клиентского сокета, чтобы закрыться, если соединение было отклонено.
маркиз Лорн
0

Я изменил свою сеть DNS, и это решило проблему

Эли Нб
источник
-2

У меня была та же самая проблема, и это оказалось из-за разрешения catalina.outфайла, не являющегося правильным. Это не было доступно для записи пользователю tomcat. Как только я установил разрешения, проблема была решена. Я узнал, что это проблема с разрешениями из журналов в tomcat8-initd.logфайле:

/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied

kbsbng
источник
1
«Отказано в доступе» - это не то же самое, что «отказано в соединении».
Маркиз Лорн
Ошибка «Отказано в доступе» была в tomcat8-initd.logфайле, в то время как в выходных журналах сервера была именно та ошибка, которая упоминалась в вопросе.
kbsbng
-3

Возможно, что предыдущий экземпляр клиента все еще работает и прослушивает порт 5000.

Майкл Манси
источник
6
Клиенты не слушают. Они говорят.
Raedwald
Предыдущий экземпляр будет вызывать BindExceptionна сервере, а не ConnectExceptionна клиенте.
Маркиз Лорн