Ява.чистая.Исключения 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);
}
}
}
}
}
760   14  

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

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

Comments

    Ничего не найдено.