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

Comments