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.(Socket.java:375) at java.net.Socket.(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); } } } } } 

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

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

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

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

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

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

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

делать

Socket clientSocket = new Socket(serverName, 5000);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

http://192.168.72.66/my_api/login.php


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

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

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

  • BOOST ASIO - Как написать консольный сервер
  • Как установить интервал прерывания или тайм-аута TCP / IP в Windows XP?
  • Как установить соединение между двумя компьютерами в разных подсетях?
  • Каков максимальный номер сетевого порта TCP / IP, допустимый для IPv4?
  • Как использовать сокет-клиент с WCF (net.tcp)?
  • максимальный размер пакета для TCP-соединения
  • Что происходит, когда я завершаю процесс, и буфер отправки сокета не пуст?
  • Как написать масштабируемый сервер Tcp / Ip
  • Действительно простой TCP-клиент
  • Найти следующий TCP-порт в .Net
  • Какова цель портов?
  • Interesting Posts

    Панель состояния iOS 7 возвращается к стилю iOS 6 по умолчанию в приложении iPhone?

    Что это означает в HTML 5, когда атрибут является логическим атрибутом?

    Удаленный доступ к PowerShell с ip-адресом в качестве целевого

    Если я выполняю обновление до Windows 8, должен ли я иметь установленную предыдущую версию или просто достаточно ключа?

    Является ли часть возвращаемого типа сигнатурой функции?

    Неинициализированная константа ActiveSupport :: Зависимости :: Mutex (NameError)

    Как сгенерировать символ отладки gcc вне цели сборки?

    Маршрутизатор перехватывает туннель SSH?

    Как запустить CMD.exe под учетной записью локальной системы?

    Как создать stream из строки?

    Java SE 6 против JRE 1.6 против JDK 1.6 – Что это значит?

    Извлеките регулярное выражение

    Как сравнить две фигуры?

    Разница между определением @interface в файлах .h и .m

    Swift playground – Как преобразовать строку с запятой в строку с десятичной запятой

    Давайте будем гением компьютера.