it-swarm-ru.tech

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);
                }
            }
        }
    }
}
153
Samantha Catania

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

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

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

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

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

34
Jon Skeet

У меня была такая же проблема с брокером 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
MrOnyancha

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

4
Dao Lam

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

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

делать 

Socket clientSocket = new Socket(serverName, 5000);

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

4
home

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

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

2
phoenix

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

«Я размещался на своем сервере в localhost и пытался подключиться к нему через эмулятор 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 Вуаля. Это IP вашего компьютера, на котором размещен ваш сервер . Use тогда вместо localhost

http://192.168.72.66/my_api/login.php


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

1
eRaisedToX

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

1
user1419243

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

1
Zhyano

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

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

1
Basheer AL-MOMANI

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

    }
}
0
Santosh Karna

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

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

0
kbsbng

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

0
Harshil Kulkarni