Я пытаюсь реализовать 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);
}
}
}
}
}
java
networking
tcp
Саманта Катания
источник
источник
Ответы:
Это исключение означает, что нет службы, прослушивающей IP / порт, к которому вы пытаетесь подключиться:
источник
You have not started your server
, но это действительно было проблемой для меня!Я бы проверил:
Простейшая отправная точка, вероятно, состоит в том, чтобы попытаться подключиться вручную с клиентского компьютера, используя telnet или Putty. Если это успешно, то проблема в вашем клиентском коде. Если это не так, вам нужно понять, почему это не так. Wireshark может помочь вам в этом.
источник
Вы должны подключить свой клиентский сокет к удаленному ServerSocket. Вместо того
Socket clientSocket = new Socket("localhost", 5000);
делать
Socket clientSocket = new Socket(serverName, 5000);
Клиент должен подключиться к serverName, которое должно совпадать с именем или IP-адресом ящика, на котором
ServerSocket
был создан ваш экземпляр (имя должно быть доступно с клиентского компьютера). Кстати: это не имя, которое важно, это все об IP-адресах ...источник
ServerSocket
, я изменил ответ. Тем не менее,clientSocket
все еще пытается подключиться кlocalhost
.У меня была такая же проблема, но запуск Сервера до запуска Клиента исправил ее.
источник
Один момент, который я хотел бы добавить к ответам выше, это мой опыт -
«Я размещался на своем сервере на локальном хосте и пытался подключиться к нему через эмулятор 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 вашего компьютера, на котором размещен ваш сервер. используйте его вместо localhosthttp://192.168.72.66/my_api/login.php
Примечание. Вы не сможете получить доступ к этому частному IP-адресу ни с одного узла за пределами этого компьютера. (Если вам нужно, вы можете использовать Ngnix для этого)
источник
У меня была такая же проблема с брокером Mqtt под названием vernemq.but решил ее, добавив следующее.
$ sudo vmq-admin listener show
показать список разрешенных ips и портов для vernemq
$ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000
добавить любой ip и ваш новый порт. Теперь вы можете подключиться без проблем.
Надеюсь, это решит вашу проблему.
источник
Надеюсь, мой опыт может быть полезным для кого-то. Я столкнулся с проблемой с той же трассировкой стека исключений, и я не мог понять, в чем проблема. Сервер базы данных, к которому я пытался подключиться, работал, и порт был открыт и принимал подключения.
Проблема была с подключением к интернету. Подключение к Интернету, которое я использовал, не позволяло подключиться к соответствующему серверу. Когда я изменил детали подключения, проблема была решена.
источник
В моем случае я дал сокету имя сервера (в моем случае «raspberrypi»), и вместо этого его создал IPv4-адрес, или, чтобы указать, IPv6 был сломан (имя было преобразовано в IPv6).
источник
В моем случае я должен был поставить галочку рядом
Expose daemon on tcp://localhost:2375 without TLS
сdocker
настройкой (в правой части панели задач, щелкните правой кнопкой мышиdocker
, выберитеsetting
)источник
я получил эту ошибку, потому что я закрыл
ServerSocket
внутри цикла for, который пытается принять количество клиентов внутри него (я не закончил принимать все клины)так что будьте осторожны, где закрыть сокет
источник
У меня была та же проблема, и проблема была в том, что я не закрывал объект сокета. После использования socket.close (); задача решена. Этот код работает для меня.
ClientDemo.java
и ServerDemo.java
источник
Я изменил свою сеть DNS, и это решило проблему
источник
У меня была та же самая проблема, и это оказалось из-за разрешения
catalina.out
файла, не являющегося правильным. Это не было доступно для записи пользователю tomcat. Как только я установил разрешения, проблема была решена. Я узнал, что это проблема с разрешениями из журналов вtomcat8-initd.log
файле:/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied
источник
tomcat8-initd.log
файле, в то время как в выходных журналах сервера была именно та ошибка, которая упоминалась в вопросе.Возможно, что предыдущий экземпляр клиента все еще работает и прослушивает порт 5000.
источник
BindException
на сервере, а неConnectException
на клиенте.