Java.net.ConnectException: соединение отклонено

Я пытаюсь реализовать 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);
                }
            }
        }
    }
}

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

Вам необходимо подключить клиентский сокет к удаленному серверу. Вместо

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

do

Socket clientSocket = new Socket(serverName, 5000);

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

Ответ 5

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

  • $ sudo vmq-admin listener show

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

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

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

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

Ответ 6

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

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

Ответ 7

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

"Я размещал на своем сервере localhost и пытался подключиться к нему через эмулятор android, указав правильный URL, например http://localhost/my_api/login.php. И я получал connection failed error

Точка для заметки - Когда я просто зашел в браузер на ПК и использовал тот же 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-адреса из любого node вне этого компьютера. (Если вам нужно, вы можете использовать Ngnix для этого)

Ответ 8

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

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

Ответ 9

В моем случае я дал сокету имя сервера (в моем случае "raspberrypi" ), а вместо этого адрес IPv4 сделал это или указал, что IPv6 был сломан (имя разрешено для IPv6)

Ответ 10

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

Ответ 11

Номер порта всегда отличается на обоих концах

Ответ 12

У меня была такая же проблема, и проблема заключалась в том, что я не закрывал объект сокета. После использования 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();

    }
}

Ответ 13

Я столкнулся с той же проблемой, мой случай был вызван самоподписанным сертификатом для SSL-соединения через https, RESTAssure не распознает сертификат как доверенный, а в соединении отказано...

Ответ 14

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

Ответ 15

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

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

Ответ 16

попробуйте отключить из Интернета (вы можете отключить Wi-Fi).