Article updated on

Cargar URL con Java Sockets

Este ejemplo muestra como conectar a una URL usando java Sockets. Puedes querer hacer esto por las siguientes razones:

  • Es un método rápido para comprobar si una URL está funcionando.
  • Comprobar si una URL está tardando demasiado en cargar.
  • Comprobar si están perdiendo algunos headers por el servidor, librerías, firewall, etc.
package com.sockets.clientweb;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
public class ClientSocket {
    public static void main(String[] args) {
        try {
            // InetSocketAddress to specify a timeout for client
            // socket
            SocketAddress sockaddr = new InetSocketAddress(
                    "www.yahoo.com", 80);
            // creates the new Socket
            Socket s = new Socket();
            s.connect(sockaddr, 10000);
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(s.getInputStream()));
            PrintWriter socketOut = new PrintWriter(
                    s.getOutputStream());
            StringBuffer req = new StringBuffer();
            req.append("GET / HTTP/1.1\n");
            req.append("Host: www.yahoo.com\n");
            req.append("Accept-Language: en-US,en;q=0.5\n");
            req.append("\n\n");
            socketOut.print(req);
            socketOut.flush();
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
            socketOut.close();
            s.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    
}

 

* El header Host debe coincidir con el dominio.

Errores posibles

  • Si el timeout especificado se excede saltará la excepción  java.net.SocketTimeoutException. 10 segundos en este ejemplo
  • Si estas tras un firewall o no tienes permisos para abrir una conexión a un puerto saltará java.net.BindException: Permission denied
  • Si no usas los headers correctos o si el servidor esta preparado para rechazar este tipo de conexiones es posible que recibas un HTTP/1.1 302 Found or 302 Moved

Notas

  • Para hacer operaciones más complejas con URLs en java es preferible utilizar una librería como org.apache.commons.httpclient.HttpClient o java.net.URL