Lab. URL y sockets Lectura del un URL • Cuando se abre un URL con el método openStream(), se crea un flujo (stream). • La lectura de un URL entonces implica la lectura de este stream. Ejemplo import java.net.*; import java.io.*; public class URLReader { public static void main(String[] args) throws Exception { URL yaqui = new URL("http://yaqui.mxl.uabc.mx/"); InputStreamReader lector = new InputStreamReader(yaqui.openStream()); BufferedReader in = new BufferedReader(lector); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } } Salida public class Main { public static void main(String[] args) { URL yaqui; try { yaqui = new URL("http://yaqui.mxl.uabc.mx/"); JFrame f = new JFrame("Página Web"); final JEditorPane ep = new JEditorPane(); ep.setEditable(false); try { ep.setPage(yaqui); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } f.getContentPane().add(new JScrollPane(ep)); f.setSize(400, 300); f.setVisible(true); } catch (MalformedURLException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } } Ejemplo en un JEditorPane Salida Conexión a un URL • Se establece una conexión a un URL con openConnection(). • Este método regresa un URLConnection. • Una conexión permite realizar operaciones con la conexión tales como configuración, lectura y escritura. Lectura URL • Esta clase está orientada a HTTP, lo cual significa que muchos de sus métodos sólo se aplican a conexiones HTTP. Ejemplo.Lectura de un URL con openConnection public class URLConnectionReader { public static void main(String[] args) throws Exception { URL yaqui = new URL("http://yaqui.mxl.uabc.mx/"); URLConnection yc = yaqui.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader( yc.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } } Escritura en un URL 1. 2. 3. 4. 5. Crear un URL. Crear un URLConnection. Configurar la conexión para salida (escritura). Establecer una conexión al recurso. Establecer un flujo de salida hacia la conexión. 6. Escribir en el flujo. 7. Cerrar el flujo de salida. Sockets 1. Abrir el socket. 2. Abrir un flujo de entrada y uno de salida al socket. 3. Leer y escribir el flujo siguiendo el protocolo del servidor. 4. Cerrar los flujos. 5. Cerrar el socket. Ejemplo Cliente import java.io.*; import java.net.*; class Cliente { static final String HOST = "localhost"; static final int PUERTO=5000; public Cliente( ) { try{ Socket skCliente = new Socket( HOST , PUERTO ); InputStream aux = skCliente.getInputStream(); DataInputStream flujo = new DataInputStream( aux ); System.out.println( flujo.readUTF() ); skCliente.close(); } catch( Exception e ) { System.out.println( e.getMessage() ); } } public static void main( String[] arg ) { new Cliente(); }} Servidor import java.io.* ; import java.net.* ; class Servidor { static final int PUERTO=5000; public Servidor( ) { try { ServerSocket skServidor = new ServerSocket( PUERTO ); System.out.println("Escucho el puerto " + PUERTO ); for ( int numCli = 0; numCli < 3; numCli++ ) { Socket skCliente = skServidor.accept(); // Crea objeto System.out.println("Sirvo al cliente " + numCli); OutputStream aux = skCliente.getOutputStream(); DataOutputStream flujo= new DataOutputStream( aux ); flujo.writeUTF( "Hola cliente " + numCli ); skCliente.close(); } System.out.println("Demasiados clientes por hoy"); } catch( Exception e ) { System.out.println( e.getMessage() ); } } public static void main( String[] arg ) { new Servidor(); } } Ejemplo 2. EchoCliente import java.io.*; import java.net.*; public class EchoClient { public static void main(String[] args) throws IOException { Socket echoSocket = null; PrintWriter out = null; BufferedReader in = null; try { echoSocket = new Socket("localhost", 9999); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader( echoSocket.getInputStream())); } catch (UnknownHostException e) { System.err.println("No conosco al servidor "+echoSocket.getLocalSocketAddress()); System.exit(1); } catch (IOException e) { System.err.println("nopuedo conectarme para I/O “ + "el error: "+e.getMessage()); System.exit(1); } BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in)); String userInput; while ((userInput = stdIn.readLine()) != null) { out.println(userInput); System.out.println("ecooooo: " + in.readLine()); } out.close(); in.close(); stdIn.close(); echoSocket.close(); } } Ejemplo 2.ServerEcho w.println("Bienvenido al Servidor de ECOOOO import java.io.*; Teclea 'bye' para cerrar."); import java.net.*; String line; public class EchoServer do { private ServerSocket server; { line = r.readLine(); public EchoServer(int portnum){ if ( line != null ) w.println("lei: "+ line); try{ } server = new ServerSocket(portnum); } while ( !line.trim().equals("bye") ); catch (Exception err) client.close(); {System.out.println(err);} } } } public void serve(){ catch (Exception err) try { while (true) { {System.err.println(err);} Socket client = server.accept(); } BufferedReader r = new BufferedReader ( public static void main(String[] args) new InputStreamReader(client.getInputStream())); { PrintWriter w = new EchoServer s = new EchoServer(9999); PrintWriter(client.getOutputStream(), true); s.serve(); } } Ejemplo Datagramas public class EnviaDatagrama { public static void main(String[] args) { try { InetAddress receiverHost = InetAddress.getByName("localhost"); int receiverPort = 9999;//Integer.parseInt(9999); String message = "Hola Maisha“; // instantiates a datagram socket for sending the data DatagramSocket mySocket = new DatagramSocket(); byte[ ] buffer = message.getBytes( ); DatagramPacket datagram = new DatagramPacket(buffer, buffer.length, receiverHost, receiverPort); mySocket.send(datagram); mySocket.close( ); } // end try catch (Exception ex) { ex.printStackTrace( ); } } // end main } Ejemplo Datagramas public class ReceptorDatagrama { public static void main(String[] args) { int port = 9999;//Integer.parseInt(args[0]); final int MAX_LEN = 10; // This is the assumed maximum byte length of the datagram to be received. try { DatagramSocket mySocket = new DatagramSocket(port); // instantiates a datagram socket for receiving the data byte[ ] buffer = new byte[MAX_LEN]; DatagramPacket datagram = new DatagramPacket(buffer, MAX_LEN); mySocket.receive(datagram); String message = new String(buffer); System.out.println(message); mySocket.close( ); } // end try catch (Exception ex) { ex.printStackTrace( ); } } // end main } // end class • Investigar como utilizando hilos el servidor puede atender a más de un cliente. • Modificar la clase ServerEcho para que funcione con múltiples clientes. • Modificar la clase ReceptorDatagrama para que funcione con múltiples clientes