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);
                }
            }
        }
    }
}

Чи можете ви опублікувати код клієнта? Якщо це віддалений клієнт, переконайтеся, що у вас немає проблем із брандмауером!
додому

Я вимкнув міжмережеві екрани як для клієнта, так і для сервера та ще одна і та ж проблема
Samantha Catania,

2
Який інтерфейс слухає сервер. Якщо ви слухаєте лише локальний хост, ви не можете віддалено підключитися.
Thorbjørn Ravn Andersen

Я намагався підключитися віддалено під час використання localhost, обличчя долонею. Це моя перша проба з TCP>. <Як змусити його працювати віддалено?
Саманта Катанія

Пам’ятайте, що у вас можуть бути між собою міжкімнатні брандмауери з «голого металу» ... чи це працює, якщо клієнт і сервер знаходяться в одній коробці?
додому

Відповіді:


323

Цей виняток означає, що на IP / порту, до якого ви намагаєтеся підключитися, немає служби прослуховування:

  • Ви намагаєтеся підключитися до неправильного IP / хосту чи порту.
  • Ви не запустили свій сервер.
  • Ваш сервер не слухає з'єднання.
  • На серверах Windows черга відставання на прослуховування заповнена.

52
Я почуваюсь німим за те, що я не помітив уваги You have not started your server, але це була справді проблема для мене!
Алексіс Леклерк

Просто для того, щоб було зрозуміло - «Ядро Java просто чудово». Єдина проблема полягає в тому, що ми не помічаємо проблеми .. (стан сервера, ipaddress, порт, підключення до Інтернету - бути на тому ж маршрутизаторі необхідно для місцевих IP-адрес і багато іншого)
Vinay Bhargav,

1
Коллін, що саме ви маєте на увазі під «сервер не чекає прийняття з'єднань»? Люди навколо цього папугують так, ніби це щось означає.
Маркіз Лорнський

Я писав це деякий час тому, але, думаю, я мав на увазі це як інший спосіб сказати, що ви не запустили свій сервер.
Ціна Коліна

у моєму випадку у мене працювали чотири симулятори Gennymotion, і я намагався завантажити додаток на вкладку Galaxy, і я отримував цю помилку. прочитавши багато з веб-сайту приятеля, я закрив усі тренажери та затемнення, вбив ADP в диспетчері завдань, а потім перезапустив Eclipse і все почало працювати належним чином. Я думаю, що коли у вас працює декілька тренажерів, а потім ви намагаєтесь підключити пристрій, АБР зійшов з мого досвіду. це мої два центи ... :)
Вінсі

40

Я би перевірив:

  • Ім'я хоста та порт, до якого ви намагаєтесь підключитися
  • Сторона сервера встигла правильно почати слухати
  • Брандмауер не блокує з'єднання

Найпростіший вихідний пункт - це, мабуть, спробувати підключити вручну з клієнтської машини за допомогою telnet або Putty. Якщо це вдалося, проблема полягає у вашому коді клієнта. Якщо це не так, вам потрібно розібратися, чому це не так. Wireshark може допомогти вам на цьому фронті.


Я іноді отримую такий виняток. Це відбувається протягом певного періоду часу. Це негайно кидає цей виняток. І тоді все стає добре. У мене на сервері є брандмауер. Але я додав вхідне правило, щоб дозволити вхідні з'єднання через порт 8080. Це правило іноді ігнорується?
Ешвін

@Ashwin: Дійсно сказати неможливо - вам би потрібно було точно розібратися, наскільки далеко отримують дані. Подивіться ваші журнали брандмауера тощо
Джон Скіт

@JonSkeet як налаштувати брандмауер, якщо у нас є ця помилка?
Nikhil Pareek

1
@Nikhil: Я не кваліфікований, щоб відповісти на це, але підозрюю, що кожному, хто має кваліфікацію, знадобиться набагато більше інформації, щоб мати змогу вам допомогти. (По-перше, ми не знаємо, який у вас брандмауер ...)
Джон Скіт

7

Вам потрібно підключити клієнтський сокет до віддаленого ServerSocket. Замість

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

робити

Socket clientSocket = new Socket(serverName, 5000);

Клієнт повинен підключитися до сервераName, який повинен відповідати імені або IP- коді вікна, в якому ServerSocketбуло створено інстанцію (ім'я повинне бути доступне на клієнтській машині). BTW: Це не важливе ім'я, це все про IP-адреси ...


Я припускаю, що вона виконує їх на одній і тій же машині для тестування, саме тому localhost було б чудово використовувати
SE

@Aaron: Вона сказала, що це працює, якщо клієнт і сервер працюють на одній машині (відповідь ви можете знайти в іншому коментарі).
додому

"Верхній рядок пов'язує сокет з localhost" Ні, це не, він пов'язує його з INADDR_ANY. Це дозволяє йому приймати з'єднання через будь-який NIC. Те, що робить ОП, вже правильно. Відповідь абсолютно невірна. Нахил
Маркіз Лорн

@EJP: Ти маєш рацію зі зміною ServerSocketвідповіді. Тим не менш, clientSocketдосі намагається підключитися localhost.
додому

@home Вам потрібно видалити фразу про адресу прив’язки.
Маркіз Лорн

7

У мене була така ж проблема, але запуск сервера перед запуском Клієнта виправив його.


4
Звичайно, потрібно запустити сервер перед клієнтом. Перший запуск клієнта та спроба підключитися до сервера означає, що ви підключаєтесь до нічого, коли ви запускаєте сервер.
user3308043

5
@ user3308043 Так, це було очевидно, але це було не надто очевидно для деяких нових програмістів (як я 3 роки тому), тому я просто хотів поділитися ним з тими хлопцями, які були незрозумілими як я.
Дао Лам

Дякую, мені це також допомогло, тест-з'єднання було успішним, але не вдалося показати дані будь-яких таблиць.
Дамієн Крістоф

6

Один момент, який я хотів би додати до відповідей вище, - це мій досвід -

«Я брав на свій сервері на локальному хості , і намагаюся підключитися до нього через андроїд емулятор , вказавши правильні 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)


4

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

  1. $ sudo vmq-admin listener show

показати список o дозволених 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 та новий порт. Тепер ви повинні мати можливість підключитися без жодних проблем.

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


1
Це врятувало мені день, але оскільки vernemq не встановлюється з apt-get, деяким людям знадобиться це посилання: vernemq.com/docs/installation/debian_and_ubuntu.html
Дамір Оледжар

2

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

Проблема була з підключенням до Інтернету. Підключення до Інтернету, яким я користувався, не дозволяло підключатися до відповідного сервера. Коли я змінив дані про з'єднання, проблему було вирішено.


1

У моєму випадку я дав сокету ім'я сервера (в моєму випадку "малиновий"), і замість цього IPv4-адресу внесли, або, щоб уточнити, IPv6 було порушено (назва вирішено на IPv6)


1

У моєму випадку мені довелося поставити галочку поруч Expose daemon on tcp://localhost:2375 without TLSу dockerналаштуванні (праворуч на панелі завдань клацніть правою кнопкою миші docker, виберіть setting)


1

я отримав цю помилку, оскільки я закрив ServerSocketвсередині циклу for, який намагається прийняти кількість клієнтів всередині нього (я не закінчив приймати всі клініки)

тому будьте обережні, де закрити Socket


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
Якщо не закривати клієнтську розетку, це не спричиняє відмови в з'єднанні. Не було б клієнтської розетки, яку потрібно закрити, якби відмовити в з'єднанні.
Маркіз Лорн


-2

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

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


1
"Відмовлено у дозволі" - це не те саме, що "відмовлено у зв’язку".
Маркіз Лорн

Помилка відхиленого дозволу була у tomcat8-initd.logфайлі, тоді як у журналах виводу сервера була вказана саме помилка, зазначена у питанні.
kbsbng

-3

Можливо, є попередній примірник клієнта, який все ще працює і слухає порт 5000.


6
Клієнти не слухають. Вони розмовляють.
Raedwald

Попередній екземпляр викликав би BindExceptionна сервері, а не ConnectExceptionна клієнті.
Маркіз Лорн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.