java.сеть.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);
                }
            }
        }
    }
}

14 ответов


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

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

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

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

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


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

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

do

Socket clientSocket = new Socket(serverName, 5000);

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


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

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

надеюсь, это решит вашу проблему. enter image description here


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


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

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


Я получил эту ошибку, потому что I closed ServerSocket inside a for loop которые пытаются принять количество клиентов внутри него (я не закончил принимать все клинты)

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


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


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


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


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

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

    }
}

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

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

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

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


чтобы получить IP для вашего локального компьютера, вы можете использовать ipconfig команда на cmd вы получите IPv4 что-то вроде 192.68.ХХ.ыы Вот. .это IP-адрес вашего компьютера, на котором размещен ваш сервер. использовать его вместо имя localhost

http://192.168.72.66/my_api/login.php


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


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


попробовать отключить из интернета (вы можете отключить WiFi).