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!