Foros del Web » Programación para mayores de 30 ;) » Java »

Problema Socket Java

Estas en el tema de Problema Socket Java en el foro de Java en Foros del Web. Muy buenas, me llamo Juan y soy nuevo en el foro. Estoy volviendome loco con un problema que tengo con un trabajo de conexion con ...
  #1 (permalink)  
Antiguo 21/01/2013, 17:57
 
Fecha de Ingreso: enero-2013
Ubicación: Burgos
Mensajes: 6
Antigüedad: 11 años, 10 meses
Puntos: 0
Problema Socket Java

Muy buenas, me llamo Juan y soy nuevo en el foro.
Estoy volviendome loco con un problema que tengo con un trabajo de conexion con Sockets. Resulta que quiero crear una aplicacion tipo teamviewer en la que dos PC puedan conectase entre sí (por ahora tengo desarrollada la opcion de listar directorios) para la universidad.
El problema es que es muy engorroso abrir los puertos y me estoy planteando utilizar los puertos 80 o 23. He escrito el código de la aplicacion y me funciona en "localhost" pero si en vez de ésta pongo mi IP pública no.
Se supone que al ser el puerto 80, no necesitaría abrir los puertos (creo).

Esta es mi aplicación servidor:

import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;

public class TCPServidor extends Thread {

public void run() {
String homeUsuario = System.getProperty("user.home");

String cadena="";

try {
ServerSocket SocketServidor = new ServerSocket(80);
Socket ComunicaConCliente = SocketServidor.accept();
System.out.println("Comunicacion establecida");
BufferedReader FlujoEntrada = new BufferedReader(new InputStreamReader(ComunicaConCliente .getInputStream()));
//FlujoSalida = new DataOutputStream(FlujoDeSalida);
PrintWriter FlujoSalida = new PrintWriter(ComunicaConCliente .getOutputStream());

do {

if((cadena = FlujoEntrada.readLine()).length()>=3){
if((cadena.substring(0,3)).equals("DIR")){

File dir = new File(homeUsuario+ "/" +cadena.substring(4,cadena.length()) );
String[] ficheros = dir.list();
if(ficheros==null){FlujoSalida.println("null");Flu joSalida.flush();}
else{
FlujoSalida.println("empieza_dir");
FlujoSalida.flush();

FlujoSalida.print(ficheros.length);
FlujoSalida.flush();
for(int i=0;i<ficheros.length;i++){
FlujoSalida.println(ficheros[i]);
FlujoSalida.flush();
}
FlujoSalida.println("fin");
FlujoSalida.flush();



}
//AQUI ACABA LA COMPARACION }
}
} while (cadena.length()>-1);


//ComunicaConCliente.close();
SocketServidor.close();

} catch (IOException e) {
System.out.println("Error en las comunicaciones");
System.exit(0);
}

}


}

y esta es la claseCliente:

import java.net.*;
import java.util.Scanner;
import java.io.*;

public class ClienteAndroid{
Socket SocketCliente;
BufferedReader FlujoEntrada;
PrintWriter FlujoSalida;

ClienteAndroid(String host) throws UnknownHostException, IOException {
SocketCliente = new Socket(host, 80);

}
public void close() throws IOException{
SocketCliente.close();
}
public String[] listarDirectorio(String path) throws IOException{
BufferedReader FlujoEntrada = new BufferedReader(new InputStreamReader(SocketCliente.getInputStream())) ;
PrintWriter FlujoSalida = new PrintWriter(SocketCliente.getOutputStream());

String StatusDir;
String leer="null";
String[] tmp = new String[200];
int pos=0;
FlujoSalida.println("DIR " + path);
FlujoSalida.flush();
try {
StatusDir=FlujoEntrada.readLine();
if(StatusDir.equals("empieza_dir")){
while(!(leer=FlujoEntrada.readLine()).equals("fin" )){
tmp[pos]=leer;
pos++;

}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Aqui se copia un array a otro
String[] devolver = new String[pos];
for(int i=0;i<devolver.length;i++)devolver[i]=tmp[i];
return devolver;


}

}
y finalmente, la clase Main que hace la prueba:

import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Scanner;


public class main {
public static void main(String[] args) throws UnknownHostException, IOException{


TCPServidor ser = new TCPServidor ();
ser.start();
Scanner sc = new Scanner(System.in);
String[] archivos;
ClienteAndroid cl = new ClienteAndroid("88.134.48.134");
String dir="";
while(!dir.equals("nada")){
dir =sc.nextLine();

archivos=cl.listarDirectorio(dir);
for(int i=0;i<archivos.length;i++)System.out.println(archi vos[i]);
}
cl.close();



}
}


Nunca llega a conectar, sin embargo si en el main pongo localhost en vez de la IP, si conecta. ¿Se supone que con la IP publica del servidor ya debería conectar no?
PD: Me da igual que el cliente / servidor tenga que aceptar peticiones del firewall, no quiero hacer un troyano pero si algo que funcione, por eso pense en lo del puerto 80.
Muchisimas gracias!
  #2 (permalink)  
Antiguo 22/01/2013, 16:50
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 16 años, 10 meses
Puntos: 39
Respuesta: Problema Socket Java

El problema que tienes no es del socket ni de java, tienes un problema de redes. Al indicar en el cliente localhost, el socket se abre directamente a tu propio pc, por lo que no hay ningún problema, cuando envías algo por el socket nunca llega a salir de tu ordenador.

Si tienes 2 o más ordenadores en red puedes poner el servidor en uno y el cliente en otro, indicando en el cliente la ip privada del servidor, de la misma forma funcionará correctamente, pues al estar en la misma red indicas mediante la ip privada a que ordenador estás conectándote con el socket.

El problema sucede con la ip pública, si tienes 2 o más ordenadores en red, todos tienen la misma ip pública, por tanto cuando alguien intenta conectarse desde internet a la ip pública ¿a que ordenador se conecta? El router es el encargado de gestionar esto, en tu router debes configurar a que ip privada deben ir los sockets de cada puerto. Esto también debes hacerlo aunque tengas solo un ordenador.
  #3 (permalink)  
Antiguo 23/01/2013, 15:12
 
Fecha de Ingreso: enero-2013
Ubicación: Burgos
Mensajes: 6
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: Problema Socket Java

Vale, muchisimas gracias, me has confirmado mis sospechas.
Entonces, ¿no hay forma de que un usuario pueda conectarse por sockets a su ordenador sin que tenga que tocar el router?
  #4 (permalink)  
Antiguo 23/01/2013, 16:58
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 16 años, 10 meses
Puntos: 39
Respuesta: Problema Socket Java

Si quieres conectar a través de la ip pública tienes que tocar el router sí o sí para abrir el puerto y asociar que ip privada recibirá el socket.
  #5 (permalink)  
Antiguo 23/01/2013, 18:34
 
Fecha de Ingreso: enero-2013
Ubicación: Burgos
Mensajes: 6
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: Problema Socket Java

Vale, entonces, qué alternativa hay para conectar con el PC la tablet sin necesidad de abrir los puertos? He visto que podría a través de un servidor pero no se si usando PHP o websocket
  #6 (permalink)  
Antiguo 24/01/2013, 13:46
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 16 años, 10 meses
Puntos: 39
Respuesta: Problema Socket Java

Realmente no se que alternativa podrías usar, de lo que recuerdo cuando estudié redes es que cualquier conexión a través de internet va por sockets y necesita de una ip y puerto para poder llegar al destino.

Etiquetas: sockets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:18.