# Programación de comunicaciones en red:
 -	Comunicación entre aplicaciones.
 -	Roles cliente y servidor.
 -	Elementos de programación de aplicaciones en red. Librerías.
 -	Sockets.
 -	Creación de sockets.
 -	Enlazado y establecimiento de conexiones.
 -	Utilización de sockets para la transmisión y recepción de información.
 -	Programación de aplicaciones cliente y servidor.
 -	Utilización de hilos en la programación de aplicaciones en red.

-------------------------

# Peticiones a servidores (GET, POST, fuerza bruta)

## Introducción
```
GetPost/postindex.php
GetPost/getindex.php
GetPost/examplepost.php
GetPost/exampleget.php
JavaScript/jh.html
JavaScript/sjh.html
JavaScript/ssjh.html
UserAgent/useragentindex.php
FuerzaBruta/index.php
FuerzaBruta/postraw.php
```

## Códigos sobre fuerza bruta
* https://github.com/jesusninoc/Seguridad/tree/master/GetPost
* https://github.com/jesusninoc/Seguridad/tree/master/FuerzaBruta
* https://github.com/jesusninoc/ClasesSeguridad/blob/master/2019-02-21.md
* https://github.com/jesusninoc/ClasesSeguridad/blob/master/2019-02-25.md
* https://github.com/jesusninoc/ClasesSeguridad/blob/master/2018-01-11.md

-------------------------

# Java

## URL

### Realizar petición HTTP mediante el método POST utilizando librerías de Apache
https://www.jesusninoc.com/2016/01/26/realizar-peticion-http-utilizando-el-metodo-post-utilizando-librerias-de-apache/

## Enviar datos desde Java

### Petición GET en Java
```Java
import java.io.*;
import java.net.*;

public class Ejemplo4 {
	public static void main(String[] args) {
		try {
			URL url = new URL("http://localhost:89/getypost/exampleget.php?nombre=Hello+World!&edad=23");
			URLConnection conexion = url.openConnection();
			// LEER DE LA URL
			BufferedReader reader = new BufferedReader(new InputStreamReader(conexion.getInputStream()));
			String linea;
			while ((linea = reader.readLine()) != null) {
				System.out.println(linea);
			}
			reader.close();// cerrar flujo
		} catch (MalformedURLException me) {
			System.err.println("MalformedURLException: " + me);
		} catch (IOException ioe) {
			System.err.println("IOException:  " + ioe);
		}
	}// main
}
```

### Petición POST en Java
```Java
import java.net.*;
import java.io.*;
import java.util.*;

public class ejemplo5 {
	public static void main(String[] args){
	try
	{
		String data = "nombre=Hello+World!&edad=23";
		URL url = new URL("http://localhost:89/getypost/examplepost.php");
		HttpURLConnection con = (HttpURLConnection) url.openConnection();
		con.setRequestMethod("POST");
		con.setDoOutput(true);
		con.getOutputStream().write(data.getBytes("UTF-8"));
		
		BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
		String linea;
		while ((linea = reader.readLine()) != null) {
			System.out.println(linea);
		}
		reader.close();// cerrar flujo

		} catch (MalformedURLException me) {
			System.err.println("MalformedURLException: " + me);
		} catch (IOException ioe) {
			System.err.println("IOException:  " + ioe);
		}
	}
}
```

------------------------

# Ejercicios:
- Simular una fuerza bruta con método POST
- Crear un servidor web que reciba peticiones GET

------------------------

## Enviar datos desde Java

### - Realizar petición HTTP mediante el método POST utilizando librerías de Apache
https://www.jesusninoc.com/2016/01/26/realizar-peticion-http-utilizando-el-metodo-post-utilizando-librerias-de-apache/

## Enviar datos desde PowerShell

### - Enviar datos a un formulario de Google Docs desde PowerShell (deducir los parámetros que se envían por POST)
https://www.jesusninoc.com/2017/04/30/enviar-datos-a-un-formulario-de-google-docs-desde-powershell-deducir-los-parametros-que-se-envian-por-post/

## Enviar datos desde Android

### - Enviar una peticion http POST desde Android a aplicación web (php)
http://codigoprogramacion.com/cursos/android/enviar-una-peticion-http-post-desde-android-a-aplicacion-web-php.html

## Scraping

### - Ejemplo básico
https://www.jesusninoc.com/08/28/html-parsing-get-information-from-a-website-bbc-news-version-28-08-2016/

### - Tweep - An Advanced Twitter Scraping Tool
https://www.kitploit.com/2017/10/tweep-advanced-twitter-scraping-tool.html

### - Scraping en Java (JSoup), con ejemplos
https://jarroba.com/scraping-java-jsoup-ejemplos/

### - Programación Movistar+ con PowerShell
https://www.jesusninoc.com/2017/10/12/programacion-movistar-con-powershell/

### Generación de diccionario de usuarios tipo jmolina@ gracias a linkedin scraping.
http://kinomakino.blogspot.com/2018/06/generacion-de-diccionario-de-usuarios.html

### Ejemplo scraping BBC con JSoup
```Java
package scratp;


import java.io.IOException;

import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class ScrapingAllPost {
	
    public static final String url = "http://localhost:89/bbc/";
    public static final int maxPages = 20;
	
	
    public static void main (String args[]) {
		
        for (int i=1; i<maxPages; i++){
			
            String urlPage = String.format(url, i);
            System.out.println("Comprobando entradas de: "+urlPage);
			
            // Compruebo si me da un 200 al hacer la petición
            if (getStatusConnectionCode(urlPage) == 200) {
				
                // Obtengo el HTML de la web en un objeto Document2
                Document document = getHtmlDocument(urlPage);
				
                // Busco todas las historias de meneame que estan dentro de: 
                Elements entradas = document.select("div.media__content");
				
                // Paseo cada una de las entradas
                for (Element elem : entradas) {
                    String titulo = elem.getElementsByClass("media__link").text();
                    String autor = elem.getElementsByClass("media__summary").text();
                    //String fecha = elem.getElementsByClass("fecha").text();
                	System.out.println(titulo);
                  	System.out.println(autor);
                    //System.out.println(titulo+"\n"+autor+"\n"+fecha+"\n");
					
                }
		
            }else{
                System.out.println("El Status Code no es OK es: "+getStatusConnectionCode(urlPage));
                break;
            }
        }
    }
	
	
    /**
     * Con esta método compruebo el Status code de la respuesta que recibo al hacer la petición
     * EJM:
     * 		200 OK			300 Multiple Choices
     * 		301 Moved Permanently	305 Use Proxy
     * 		400 Bad Request		403 Forbidden
     * 		404 Not Found		500 Internal Server Error
     * 		502 Bad Gateway		503 Service Unavailable
     * @param url
     * @return Status Code
     */
    public static int getStatusConnectionCode(String url) {
		
        Response response = null;
		
        try {
            response = Jsoup.connect(url).userAgent("Mozilla/5.0").timeout(100000).ignoreHttpErrors(true).execute();
        } catch (IOException ex) {
            System.out.println("Excepción al obtener el Status Code: " + ex.getMessage());
        }
        return response.statusCode();
    }
	
	
    /**
     * Con este método devuelvo un objeto de la clase Document con el contenido del
     * HTML de la web que me permitirá parsearlo con los métodos de la librelia JSoup
     * @param url
     * @return Documento con el HTML
     */
    public static Document getHtmlDocument(String url) {

        Document doc = null;

        try {
            doc = Jsoup.connect(url).userAgent("Mozilla/5.0").timeout(100000).get();
        } catch (IOException ex) {
            System.out.println("Excepción al obtener el HTML de la página" + ex.getMessage());
        }

        return doc;

    }
}	
```
