getoutputstream - socket read java
Red Java "Conexión rechazada: conectar" (5)
Es probable que el socket del servidor solo esté vinculado a la dirección del localhost. Puede vincularlo a una dirección IP específica utilizando la forma de 3 argumentos del constructor.
He estado tratando de ejecutar un programa de prueba de redes simple sin resultados.
Servidor:
import java.io.*;
import java.net.*;
public class ServerTest {
public static void main(String[] args) {
final int PORT_NUMBER = 44827;
while(true) {
try {
//Listen on port
ServerSocket serverSock = new ServerSocket(PORT_NUMBER);
System.out.println("Listening...");
//Get connection
Socket clientSock = serverSock.accept();
System.out.println("Connected client");
//Get input
BufferedReader br = new BufferedReader(new InputStreamReader(clientSock.getInputStream()));
System.out.println(br.readLine());
br.close();
serverSock.close();
clientSock.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
Cliente:
import java.io.*;
import java.net.*;
public class ClientTest {
public static void main(String[] args) throws IOException {
final int PORT_NUMBER = 44827;
final String HOSTNAME = "xx.xx.xx.xx";
//Attempt to connect
try {
Socket sock = new Socket(HOSTNAME, PORT_NUMBER);
PrintWriter out = new PrintWriter(sock.getOutputStream(), true);
//Output
out.println("Test");
out.flush();
out.close();
sock.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
El programa funciona bien cuando uso 127.0.0.1 o mi IP interna para el nombre de host. Pero cada vez que cambio a mi dirección IP externa, arroja una java.net.ConnectException: Connection refused: connect
error de java.net.ConnectException: Connection refused: connect
.
Escogí deliberadamente un puerto tan poco común para ver si ese era el problema, sin suerte. Puedo conectarme sin problemas usando telnet, pero cuando trato de acceder al puerto con canyouseeme.org, me dice que la conexión ha expirado. Incluso traté de desactivar todos los firewalls y antivirus, incluidos los predeterminados de Windows y el firewall del enrutador, con todos los puertos reenviados y DMZ habilitado, y todavía dice que se agotó el tiempo de espera de la conexión. Yo uso Comcast como mi ISP, y dudo que bloqueen un puerto tan aleatorio.
Cuando uso un trazador de paquetes, muestra el tráfico TCP con mi computadora enviando SYN y recibiendo RST / ACK, por lo que parece un puerto bloqueado estándar, y no estaba ocurriendo ningún otro tráfico sospechoso de paquetes.
No tengo idea de lo que está pasando en este punto; He probado prácticamente todos los trucos que conozco. Si alguien sabe por qué el puerto podría estar bloqueado, o al menos alguna forma de hacer que el programa funcione, sería muy útil.
Por lo que vale, tu código funciona bien en mi sistema.
Odio decirlo, pero suena como un problema de firewall (que sé que ya has verificado tres veces) o un problema de Comcast , que es más posible de lo que piensas. Yo probaría tu ISP .
Este problema viene en las siguientes situaciones:
Cliente y servidor, uno o ambos no están en la red.
El servidor no se está ejecutando.
El servidor se está ejecutando pero no está escuchando en el puerto, el cliente está intentando conectarse.
El cortafuegos no está permitido para la combinación de puerto de host.
La combinación de puerto de host es incorrecta.
Protocolo incorrecto en Cadena de conexión.
Como resolver el problema:
Primero haces ping al servidor de destino. Si eso está haciendo ping correctamente, entonces el cliente y el servidor están ambos en la red.
Intente conectarse al host y al puerto del servidor mediante telnet. Si puedes conectarte con él, entonces estás cometiendo algunos errores en el código del cliente.
Supongo que estás usando un enrutador para conectarte a Internet. Debe hacer el reenvío de puertos para permitir que el público acceda a su red interna. Echa un vistazo a ¿Cómo se obtienen los conectores Java que funcionan con IP públicas?
También escribí una publicación en un blog sobre el reenvío de puertos. Puede echarle un vistazo :) http://happycoders.wordpress.com/2010/10/03/how-to-setup-a-web-server-by-yourself /
Pero todavía no pude acceder a esto por IP pública, trabajando en eso ahora ...
Tuve el mismo problema porque a veces el cliente se iniciaba antes que el servidor y, cuando intentó establecer la conexión, no pudo encontrar un servidor en ejecución.
Mi primera (no tan elegante) solución fue detener al cliente por un tiempo usando el método de suspensión:
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
Utilizo este código justo antes de la conexión del cliente, en su ejemplo, justo antes de Socket sock = new Socket(HOSTNAME, PORT_NUMBER);
Mi segunda solución se basó en esta respuesta. Básicamente, creé un método en la clase de cliente, este método intenta conectarse al servidor y, si la conexión falla, espera dos segundos antes de volver a intentarlo. Este es mi método:
private Socket createClientSocket(String clientName, int port){
boolean scanning = true;
Socket socket = null;
int numberOfTry = 0;
while (scanning && numberOfTry < 10){
numberOfTry++;
try {
socket = new Socket(clientName, port);
scanning = false;
} catch (IOException e) {
try {
Thread.sleep(2000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
return socket;
}
Como puede ver, este método intenta crear un socket por diez veces, luego devuelve un valor nulo para el socket, así que tenga cuidado y verifique el resultado.
Tu código debería convertirse en:
Socket sock = createClientSocket(HOSTNAME, PORT_NUMBER);
if(null == sock){ //log error... }
Esta solución me ayudó, espero que te ayude también. ;-)