java - example - socket tcp
java.net.ConnectException: conexión rechazada (14)
Debe conectar su socket de cliente al ServerSocket remoto. En lugar de
Socket clientSocket = new Socket("localhost", 5000);
hacer
Socket clientSocket = new Socket(serverName, 5000);
El cliente debe conectarse a serverName, que debe coincidir con el nombre o la IP de la caja en la que se ServerSocket
instancia de ServerSocket
(el nombre debe ser accesible desde la máquina del cliente). Por cierto: no es el nombre lo que importa, todo se trata de direcciones IP ...
Estoy tratando de implementar una conexión TCP, todo funciona bien desde el lado del servidor, pero cuando ejecuto el programa cliente (desde la computadora cliente) aparece el siguiente error:
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)
Traté de cambiar el número de socket en caso de que estuviera en uso, pero fue en vano, nadie sabe qué está causando este error y cómo solucionarlo.
El código del servidor:
//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);
}
}
}
}
}
El código del cliente:
//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);
}
}
}
}
}
El número de puerto siempre es diferente en ambos extremos
En mi caso, le di al socket el nombre del servidor (en mi caso, "raspberrypi"), y en su lugar una dirección IPv4 lo hizo, o para especificar, IPv6 se rompió (el nombre se resolvió en un IPv6)
En mi caso, tuve que poner una marca de verificación cerca de Expose daemon on tcp://localhost:2375 without TLS
en la configuración del docker
(en el lado derecho de la barra de tareas, haga clic derecho en el docker
, seleccione setting
)
Espero que mi experiencia sea útil para alguien. Enfrenté el problema con el mismo rastreo de pila de excepción y no pude entender cuál era el problema. El servidor de la base de datos que estaba tratando de conectar se estaba ejecutando y el puerto estaba abierto y aceptaba conexiones.
El problema era con la conexión a internet. La conexión a Internet que estaba usando no tiene permitido conectarse al servidor correspondiente. Cuando cambié los detalles de la conexión, el problema se resolvió.
Esta excepción significa que no hay servicio de escucha en la IP / puerto al que intenta conectarse:
- Está tratando de conectarse a la IP / puerto incorrecta.
- No has comenzado tu servidor.
- Su servidor no está escuchando conexiones.
- En los servidores de Windows, la cola de espera para escuchar está llena.
Obtuve este error porque I closed ServerSocket inside a for loop
que intentaba aceptar la cantidad de clientes dentro de él (no terminé de aceptar todos los clints)
así que ten cuidado con dónde cerrar tu zócalo
Podría ser que haya una instancia anterior del cliente que todavía esté ejecutándose y escuchando en el puerto 5000.
Tuve el mismo problema con el agente de Mqtt llamado vernemq.pero lo resolví agregando lo siguiente.
-
$ sudo vmq-admin listener show
mostrar la lista o permitidos ips y puertos para vernemq
-
$ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000
para agregar cualquier ip y su nuevo puerto. ahora deberías poder conectarte sin ningún problema.
Tuve el mismo problema y el problema fue que no cerraba el objeto socket.Después de usar socket.close (); problema resuelto. Este código funciona para mí.
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();
}
}
y 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();
}
}
Tuve el mismo problema, pero la ejecución del Servidor antes de ejecutar el Cliente lo solucionó.
Un punto que me gustaría agregar a las respuestas anteriores es mi experiencia :
"Recibí en mi servidor en localhost y estaba tratando de conectarme a través de un emulador de Android especificando la URL adecuada como http://localhost/my_api/login.php
. Y recibí un error de conexión rechazada "
Punto a destacar: cuando fui al navegador en la PC y usé la misma URL ( http://localhost/my_api/login.php
) recibí la respuesta correcta
por lo que el problema en mi caso fue el término localhost
que reemplacé con la IP de mi servidor (ya que su servidor está alojado en su máquina) lo que hizo que fuera accesible desde mi emulador en la misma PC.
Para obtener IP para su máquina local, puede usar el comando ipconfig
en cmd obtendrá IPv4 algo así como 192.68.xx.yy Voila .. esa es la IP de su máquina donde tiene su servidor alojado. usarlo a continuación, en lugar de localhost
http://192.168.72.66/my_api/login.php
Nota: no podrá acceder a esta IP privada desde ningún nodo fuera de esta computadora. (En caso de que lo necesite, puede usar Ngnix para eso)
Yo comprobaría:
- Nombre de host y puerto al que intentas conectarte
- El lado del servidor ha logrado comenzar a escuchar correctamente
- No hay un firewall bloqueando la conexión
El punto de partida más simple es probablemente intentar conectarse manualmente desde la máquina del cliente utilizando telnet o Putty. Si eso tiene éxito, entonces el problema está en su código de cliente. Si no es así, debes averiguar por qué no lo hizo. Wireshark puede ayudarte en este frente.
intente desconectarse de Internet (puede desactivar wifi).