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