La proxima vez que afrontemos una tarea de networking que nos tiene considerando utilizar la Web Services API o alguna otra API de alto nivel, deberíamos considerar si podríamos obtener la misma funcionalidad de un modo más sencillo, y con menos procesamiento al utilizar Sockets. En este artículo utilizaremos las clases SocketChannel y ServerSocketChannel classes en el paquete java.nio para crear aplicaciones simples con capacidad de trabajo en red.
Cuando usamos un browser web para acceder a una página web particular, los detalles se mantienen ocultos de nuestros ojos. Abramos un browser y tipeemos:
http://developer.java.sun.com/developer/JDCTechTips/
Como resultado, esta entrada nos conectará al puerto 80 del sitio web. También envía un pedido HTTP (HTTP request) particular que contiene el nombre de la página que deseamos visualizar.
Ahora, efectuemos estas acciones explícitamente con SocketChannel . El siguiente programa, TechTipReader , utiliza SocketChannel para obtener la página. Nótese el método getTips() en el programa. Este método primero instancia un SocketChannel . Luego usa esa instancia para conectarse al puerto 80 de developer.java.sun.com . Después de esto, el método envía un pedido estándar HTTP " GET " para obtener la página JDCTechTips.
La respuesta del servidor se imprime por salida estándar.
import java.nio.channels.SocketChannel; import java.nio.charset.Charset; import java.nio.ByteBuffer; import java.net.InetSocketAddress; import java.io.IOException; public class TechTipReader { private Charset charset = Charset.forName("UTF-8"); private SocketChannel channel; public void getTips() { try { connect(); sendRequest(); readResponse(); } catch (IOException e) { e.printStackTrace(); } finally { if (channel != null) { try { channel.close(); } catch (IOException e) {} } } } private void connect() throws IOException { InetSocketAddress socketAddress = new InetSocketAddress( "developer.java.sun.com", 80); channel = SocketChannel.open(socketAddress); } private void sendRequest() throws IOException { channel.write(charset.encode("GET " + "/developer/JDCTechTips/" + "rnrn")); } private void readResponse() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1024); while ((channel.read(buffer)) != -1) { buffer.flip(); System.out.println(charset.decode(buffer)); buffer.clear(); } } public static void main(String[] args) { new TechTipReader().getTips(); } }Observando más profundamente el programa TechTipReader , nótese que el método connect() crea una InetSocketAddress pasándole dos parámetros: un String que representa el dominio, y el puerto HTTP estándar 80. La llamada al método static SocketChannel.open() recibe la InetSocketAddress como parámetro. Esta llamada es equivalente a las siguientes dos sentencias:
channel = SocketChannel.open(); channel.connect(socketAddress);El método sendRequest() envía el pedido de tres líneas. La primera línea es " GET /developer/JDCTechTips/ " y la segunda y tercera están vacías. La llamada a channel.write() recibe un ByteBuffer como argumento, por lo que debemos convertir la String . La mayor parte del tiempo empleada en trabajar con SocketChannels implica conversiones ida y vuelta (desde y hacia ByteBuffers ). Existen varias maneras de realizar la conversión, este ejemplo usa el método encode() de la clase java.nio.charset.Charset .
El método readResponse() es responsable de manipular la respuesta retornada al SocketChannel . El método lee desde el SocketChannel hacia ByteBuffer . Mientras no se halla alcanzado el final del archivo que está siendo transferido, el método modifica el estado del buffer cambiándolo de leyendo, a preparado para escribir. Los contenidos del ByteBuffer son transformados por el método charset.decode() hacia una String que es enviada a salida estándar.
Cuando ejecutamos el programa TechTipReader , deberíamos obtener el HTML de la página.
Usuarios que han visto este tema también han visto...
- Las Clases String y StringBuffer en Java
- Cómo conectar Java y Access
- Consejos Técnicos de la Conexión del Desarrollador Java
- La fecha en un JSP
- Extendiendo el Runtime de Java con nuevos idiomas
Información legal | Política de Privacidad | Contacte con nosotros
Otro proyecto de Factoría de Internet. Copyright© 2003-2008 Factoría de Internet S.L.. Todos los derechos reservados.