lunes, 11 de marzo de 2013

Sockets con java




Los sockets en cualquier lenguaje de programacion, son muy importantes. Nos permiten conectarnos a un  host que se encuentre en una red lan o en internet. Gracias al desarrollo de algunas librerias en los lenguajes de programacion podemos hacer uso de ellos.

Para nuestro ejemplo algo basico pero sirve como entendimiento de lo que significa esto.

http://es.wikipedia.org/wiki/Socket_de_Internet

Lo primero que debemos hacer es importar algunas librerias.



No me detendre mucho explicando que es java, como declara funciones o como declarar variables, hay bastante documentacion al respeto en google. Luego que tenemos declaradas nuestras librerias es hora de inicializarlas.






Declaramos algunas variables publicas para poderlas utilizar en el programa, los tipos de datos BufferedReader, PrintWriter y Socket no serviran mucho para realizar conexion a host remotos. Luego creamos una funcion llamada conexion y dentro de ella ingresamos un bloque de try y catch en caso de que nos llegue a arrojar alguna exepcion la capturamos y poder depurar nuestro programa.





Realizamos la conexion al host usando la variable de conexion, acontinuacion utilizamos la variable entrada y salida para poder enviar y recibir informacion.




Para poder enviar informacion hacemos uso de la variable salida y utilizamos algunos metodos ya implementados en la libreria java.net.PrintWriter. Como vamos a conectarnos a un servidor web enviamos las cabeceras y esperamos una respuesta.



 Con la linea
while (entrada.readLine() != null){
                System.out.println(entrada.readLine());
            }

lo que hacemoses recibir los datos que nos envie el servidor y luego los imprimimos en estos momentos nos arrojaria el texto html




 Podemos realizar aun cosas mas interesantes ya tenemos la conexion con el host, ya recibimos texto html, ahora es el turno de las expresiones regulares. Podremos conseguir enlaces que se encuentren dentro de la url un ejemplo vamos a capturar todos los href de la web asi tener mas claridad de la pagina web.

Para realizar esto tenemos que declarar una variable de tipo array donde guardaremos cada enlace.





Despues de declarar el array solo tenemos que agregar algunas intrucciones


 Vamos a explicar por partes

while(entrada.readLine() != null){
                mensaje = entrada.readLine();
                respuesta = respuesta.append(mensaje);
               
            }


en esta instruccion miramos mientras que entrada.readLine() sea distinto de null guardamos en  mensaje el texto enviado desde el servidor y en respuesta almacenamos el resultado de respuesta y agregamos el resultado de mensaje, asi nos queda mas facil para utilizar el texto y poder buscar lo que necesitamos

Pattern buscar = Pattern.compile("href=\"(.*?)\"", Pattern.CASE_INSENSITIVE);
           
            Matcher palabra = buscar.matcher(respuesta);


aca creamos una variable Pattern para poder buscar un texto en lo almacenado anteriormente con  Pattern.compile("href=\"(.*?)\"", Pattern.CASE_INSENSITIVE); buscamos lo que necesitamos en este caso todos los href lo que contiene es una expresion regular que nos sacara todos los href del codigo html. Luego declaramos una variable Matcher y utilizamos el metodo de Pattern matcher para buscar en respuesta.

 while(palabra.find()){
              
                   i++;
                   path[i] = palabra.group();
                 
                  System.out.println(path[i]+"  "+i);
              
             }

           

aca utilizamos el while y usamos el metodo de Matcher find para buscar la palabra,  mientras este buscando, almacene lo encontrado en path. palabra.group() contiene lo buscado en el texto html y luego simplemente mostramos lo encontrado. Veamos que nos muestra el programa.



Exactamente lo que esperabamos, bueno hasta aca este minituto sobre sockets recuerda que hay mas, funciones de esas librerias de java. Esto tan solo es un comienzo se puede desarrolar algun crawling o algun scanner de vulnerabilidades. Esto es algo basico, existen funciones para crear servidor y cliente en este caso hemos creado un cliente que se conecta a un website y envia algunas peticiones http.

Referencias

http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html
http://docs.oracle.com/javase/6/docs/api/java/io/package-summary.html

3p1c0w3nd

No hay comentarios:

Publicar un comentario