java.net.ConnectException: соединение отказано - PullRequest
161 голосов
/ 29 июля 2011

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

Ответы [ 13 ]

282 голосов
/ 29 июля 2011

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

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

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

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

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

6 голосов
/ 25 июля 2012

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

4 голосов
/ 05 апреля 2016

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

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

4 голосов
/ 29 июля 2011

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

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

до

Socket clientSocket = new Socket(serverName, 5000);

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

2 голосов
/ 26 февраля 2018

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

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

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

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


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

http://192.168.72.66/my_api/login.php


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

2 голосов
/ 17 ноября 2014

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

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

1 голос
/ 23 августа 2017

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

1 голос
/ 21 декабря 2016

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

1 голос
/ 22 мая 2016

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...