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);
}
}
}
}
}
Ответы
Ответ 1
Это исключение означает, что нет службы, прослушивающей IP/порт, к которому вы пытаетесь подключиться:
- Вы пытаетесь подключиться к неправильному IP/хосту или порту.
- Вы не запустили свой сервер.
- Ваш сервер не прослушивает соединения.
- На серверах Windows очередь прослушивания невыполнена.
Ответ 2
Я бы проверял:
- Имя хоста и порт, который вы пытаетесь подключиться к
- На стороне сервера удалось правильно начать прослушивание
- Нет брандмауэра, блокирующего соединение.
Простейшей отправной точкой является попытка подключиться вручную с клиентской машины с помощью telnet или Putty. Если это удастся, проблема в коде клиента. Если это не так, вам нужно решить, почему этого не произошло. Wireshark может помочь вам на этом фронте.
Ответ 3
У меня была такая же проблема, но запуск сервера перед запуском Client исправил его.
Ответ 4
Вам необходимо подключить клиентский сокет к удаленному серверу. Вместо
Socket clientSocket = new Socket("localhost", 5000);
do
Socket clientSocket = new Socket(serverName, 5000);
Клиент должен подключиться к serverName, который должен соответствовать имени или IP-адресу, в котором был создан ваш ServerSocket
(имя должно быть доступно с клиентской машины). BTW: Это не имя, которое важно, все о IP-адресах...
Ответ 5
У меня была такая же проблема с брокером Mqtt, что и vernemq.but, но он решил добавить следующее.
-
$ sudo vmq-admin listener show
чтобы отобразить список o разрешенных ips и портов для vernemq
-
$ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000
чтобы добавить любой ip и ваш новый порт. теперь u должен иметь возможность подключаться без каких-либо проблем.
Надеюсь, он решает вашу проблему.
![введите описание изображения здесь]()
Ответ 6
Надеюсь, мой опыт может быть полезен кому-то. Я столкнулся с проблемой с той же трассировкой стека исключений, и я не мог понять, в чем проблема. Сервер базы данных, который я пытался подключить, был запущен, и порт был открыт и принимал соединения.
Проблема заключалась в подключении к Интернету. Подключение к Интернету, которое я использовал, не разрешалось подключаться к соответствующему серверу. Когда я изменил детали соединения, проблема была решена.
Ответ 7
Один момент, который я хотел бы добавить к приведенным выше ответам, - мой опыт -
"Я размещал на своем сервере localhost и пытался подключиться к нему через эмулятор android, указав правильный URL, например http://localhost/my_api/login.php
. И я получал connection failed error
Точка для заметки - Когда я просто зашел в браузер на ПК и использовал тот же 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-адреса из любого node вне этого компьютера. (Если вам нужно, вы можете использовать Ngnix для этого)
Ответ 8
я получил эту ошибку, потому что я закрыл ServerSocket
внутри цикла for, который пытается принять количество клиентов внутри него (я не закончил принимать все клины)
так что будьте осторожны, где закрыть сокет
Ответ 9
В моем случае я дал сокету имя сервера (в моем случае "raspberrypi" ), а вместо этого адрес IPv4 сделал это или указал, что IPv6 был сломан (имя разрешено для IPv6)
Ответ 10
В моем случае мне нужно было поставить галочку рядом с Expose daemon on tcp://localhost:2375 without TLS
в docker
(в правой части панели задач, щелкните правой кнопкой мыши на docker
, выберите setting
)
Ответ 11
Номер порта всегда отличается на обоих концах
Ответ 12
У меня была такая же проблема, и проблема заключалась в том, что я не закрывал объект сокета. После использования 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();
}
}
Ответ 13
Я столкнулся с той же проблемой, мой случай был вызван самоподписанным сертификатом для SSL-соединения через https, RESTAssure не распознает сертификат как доверенный, а в соединении отказано...
Ответ 14
Возможно, что есть предыдущий экземпляр клиента, который все еще работает и прослушивает порт 5000.
Ответ 15
У меня была та же самая проблема, и это оказалось из-за разрешения файла catalina.out
который был неправильным. Это не было доступно для записи пользователю tomcat. Как только я исправил разрешения, проблема была решена. Я узнал, что это проблема с разрешениями из журналов в tomcat8-initd.log
:
/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied
Ответ 16
попробуйте отключить из Интернета (вы можете отключить Wi-Fi).