java.сеть.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);
}
}
}
}
}
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.но решил его, добавив следующее.
$ 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 и ваш новый порт. теперь вы должны быть в состоянии подключиться без каких-либо проблем.
Надеюсь, мой опыт может быть кому-то полезен. Я столкнулся с проблемой с той же трассировкой стека исключений, и я не мог понять, в чем проблема. Сервер базы данных, который я пытался подключить, работал, и порт был открыт и принимал соединения.
проблема заключалась в подключении к интернету. Подключение к Интернету, которое я использовал, не было разрешено подключаться к соответствующему серверу. Когда я изменил детали соединения, проблема была решена.
Я получил эту ошибку, потому что 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 для этого)