APÉNDICE D) Crear y utilizar sockets."Muy bien", dice el programador novato, "Quiero comenzar a trabajar en Internet de un a manera sencilla y personalizada". "¿Está seguro?" responde. "Lo estoy", dice el programador novato. "En tal caso" responde, "Prueba con la clase Socket". La comunicación a través de Internet requiere sockets para crear las conexiones. Los sockets se conectan a puertos de comunicaciones numerados. Los 1,024 puertos inferiores se reservan para uso del sistema (por ejemplo, el puerto 21 es para FTP, el 23 para Telnet, el 25 para correo electrónico, el 80 para conexiones http, y el 119 para conexiones Usenet). Java soporta sockets mediante la clase Socket. Observe el diagrama de herencia para la clase Socket: java.lang.Object |____java.net.Socket En la siguiente tabla, la tabla D.1., encontrará los constructores de la clase Socket; y sus métodos en la tabla D.2.: Tabla D.1. Constructores de la clase Socket
Constructor
Descripción
protected Socket( ) Socket(InetAddress port)
Construye un socket no conectado. address,
int Construye un socket stream y lo conecta al Puerto indicado en la dirección IP.
Socket(InetAddress host, int port, Obsoleto. Utilice DatagramSocket en su lugar. boolean stream) Socket(InetAddress address, port, InetAddress localAddr, localPort)
int Construye un socket .y lo conecta a la dirección int remota indicada en el puerto remoto
protected Socket(SocketImpl impl)
Construye un socket desconectado mediante la clase abstracta SocketImpl.
Socket(String host, int port)
Construye un socket stream y lo conecta al número de Puerto indicado en el host.
Socket(String host, int port, boolean Obsoleto. Use DatagramSocket en su lugar. stream) Socket(String host, int port, Construye un socket y lo conecta al host remoto InetAddress localAddr, int localPort) indicado en el Puerto remoto.
Tabla D. 2. Métodos de la clase Socket
Método
Descripción
void close( )
Cierra este socket.
InetAddress getInetAddress( )
Obtiene la dirección a la que está conectado el socket.
InputStream getInputStream( )
Obtiene un stream de entrada (input) para este socket.
InetAddress getLocalAddress( )
Devuelve la dirección local a la que está unido el socket.
int getLocalPort( )
Devuelve el puerto local al que está unido el socket.
OutputStream getOutputStream( )
Obtiene un stream de salida (output) para este socket.
int getPort( )
Localiza el Puerto remoto al que está conectado el socket.
int getReceiveBufferSize( )
Obtiene el valor de la opción SO_RCVBUF para este socket (el tamaño del buffer de entrada).
int getSendBufferSize( )
Obtiene el valor de la opción SO_SNDBUF para este socket (el tamaño del buffer de salida).
int getSoLinger( )
Genera el ajuste de SO_LINGER.
int getSoTimeout( )
Genera el ajuste de SO_TIMEOUT.
boolean getTcpNoDelay( )
Prueba si TCP_NODELAY está activo.
void setReceiveBufferSize(int size)
Ajusta la opción de SO_RCVBUF al valor indicado.
void setSendBufferSize(int size)
Ajusta la opción de SO_SNDBUF al valor indicado.
static void Establece la implementación del socket cliente. setSocketImplFactory(SocketImplFa ctory fac) void setSoLinger(boolean on, int Activa/desactiva SO_LINGER linger) tiempo medido en segundos.
transcurrido
un
void setSoTimeout(int timeout)
Activa/desactiva SO_TIMEOUT transcurridos x milisegundos..
void setTcpNoDelay(boolean on)
Activa/desactiva TCP_NODELAY.
String toString( )
Convierte este socket en un string (cadena).
Observe un ejemplo. En este caso, se conectará al puerto 80 de sun.com, el puerto http, y accederá a la página Web principal en www.sun.com, index.html, escribiendo una solicitud http a dicho puerto. Para escribir en un socket, puede utilizar el objeto PrintWriter, y para leer desde él, el objeto BufferedReader.
Compruebe el código (observe que se ha terminado la solicitud http con dos caracteres de nueva línea): Import java.io.*; import java.net.*; public class sockets { public static void main(String[] args) { try { Socket s = new Socket("www.sun.com", 80); BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter out = new PrintWriter(s.getOutputStream()); out.print("GET /index.html\n\n"); out.flush(); String line; while ((line = in.readLine()) != null){ System.out.println(line); } } catch (Exception e){} } }
Y éste es el resultado de este código: C:\>java sockets <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org /TR/REC-html40/loose.dtd"> <HTML> <HEAD> <TITLE>Sun Microsystems</TITLE> . . . Este ejemplo utilizó el Puerto HTTP del servidor Web de Sun para conectarse. Sin embargo, puede generar ambos lados de la conexión (el cliente y el servidor) en Java. Para ello, lea el apartado dedicado a clientes/servidores TCP.