12
Practi ca de envio de archiv os (socke ts) mayo 3 2013 Michael Flores Popocatl Sistemas Distribui dos

michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura

Practica de envio de archivos (sockets)

mayo 3

2013Michael Flores Popocatl Sistemas Distribuidos

Page 2: michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura

package cliente;

import java.awt.BorderLayout;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.EOFException;import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.*;

/**Clase que se encarga de correr los threads de enviar y recibir texto * y de crear la interfaz grafica. * * @author Rafa */public class PrincipalChat extends JFrame{ public JTextField campoTexto; //Para mostrar mensajes de los usuarios public JTextArea areaTexto; //Para ingresar mensaje a enviar private static ServerSocket servidor; // private static Socket cliente; //Socket para conectarse con el cliente private static String ip = "127.0.0.1"; //ip a la cual se conecta public static PrincipalChat main; public PrincipalChat(){ super("Cliente"); //Establece titulo al Frame campoTexto = new JTextField(); //crea el campo para texto

Page 3: michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura

campoTexto.setEditable(false); //No permite que sea editable el campo de texto add(campoTexto, BorderLayout.NORTH); //Coloca el campo de texto en la parte superior areaTexto = new JTextArea(); //Crear displayArea areaTexto.setEditable(false); add(new JScrollPane(areaTexto), BorderLayout.CENTER); areaTexto.setBackground(Color.orange); //Pone de color cyan al displayArea areaTexto.setForeground(Color.BLACK); //pinta azul la letra en el displayArea campoTexto.setForeground(Color.BLACK); //pinta toja la letra del mensaje a enviar //Crea menu Archivo y submenu Salir, ademas agrega el submenu al menu JMenu menuArchivo = new JMenu("Archivo"); JMenuItem salir = new JMenuItem("Salir"); menuArchivo.add(salir); //Agrega el submenu Salir al menu menuArchivo JMenuBar barra = new JMenuBar(); //Crea la barra de menus setJMenuBar(barra); //Agrega barra de menus a la aplicacion barra.add(menuArchivo); //agrega menuArchivo a la barra de menus //Accion que se realiza cuando se presiona el submenu Salir salir.addActionListener(new ActionListener() { //clase interna anonima public void actionPerformed(ActionEvent e) { System.exit(0); //Sale de la aplicacion } }); setSize(300, 320); //Establecer tamano a ventana

Page 4: michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura

setVisible(true); //Pone visible la ventana } //Para mostrar texto en displayArea public void mostrarMensaje(String mensaje) { areaTexto.append(mensaje + "\n"); } public void habilitarTexto(boolean editable) { campoTexto.setEditable(editable); } /** * @param args the command line arguments */ public static void main(String[] args) { PrincipalChat main = new PrincipalChat(); //Instanciacion de la clase Principalchat main.setLocationRelativeTo(null); //Centrar el JFrame main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //habilita cerrar la ventana ExecutorService executor = Executors.newCachedThreadPool(); //Para correr los threads try { main.mostrarMensaje("Buscando Servidor ..."); cliente = new Socket(InetAddress.getByName(ip), 11111); //comunicarme con el servidor main.mostrarMensaje("Conectado a :" + cliente.getInetAddress().getHostName()); main.habilitarTexto(true); //habilita el texto //Ejecucion de los Threads executor.execute(new ThreadRecibe(cliente, main)); executor.execute(new ThreadEnvia(cliente, main));

} catch (IOException ex) {

Page 5: michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura

Logger.getLogger(PrincipalChat.class.getName()).log(Level.SEVERE, null, ex); } //Fin del catch finally { } executor.shutdown(); }}

Page 6: michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura

package cliente;

import java.io.IOException;import java.io.ObjectOutputStream;import java.net.Socket;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.net.SocketException; public class ThreadEnvia implements Runnable { private final PrincipalChat main; private ObjectOutputStream salida; private String mensaje; private Socket conexion; public ThreadEnvia(Socket conexion, final PrincipalChat main){ this.conexion = conexion; this.main = main;

Page 7: michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura

//Evento que ocurre al escribir en el campo de texto main.campoTexto.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { mensaje = event.getActionCommand(); enviarDatos(mensaje); //se envia el mensaje main.campoTexto.setText(""); //borra el texto del enterfield } //Fin metodo actionPerformed } );//Fin llamada a addActionListener } //enviar objeto a cliente private void enviarDatos(String mensaje){ try { salida.writeObject("Cliente>>> " + mensaje); salida.flush(); //flush salida a cliente main.mostrarMensaje("Cliente>>> " + mensaje); } //Fin try catch (IOException ioException){ main.mostrarMensaje("Error escribiendo Mensaje"); } //Fin catch } //Fin metodo enviarDatos

//manipula areaPantalla en el hilo despachador de eventos public void mostrarMensaje(String mensaje) { main.areaTexto.append(mensaje); } public void run() { try { salida = new ObjectOutputStream(conexion.getOutputStream()); salida.flush(); } catch (SocketException ex) { } catch (IOException ioException) { ioException.printStackTrace(); } catch (NullPointerException ex) {

Page 8: michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura

} } }

import java.net.*;import java.io.*;import java.util.*;

class RecibirArchivo{ private ServerSocket servidor = null; public RecibirArchivo( ) throws IOException { // Creamos socket servidor escuchando en el mismo puerto donde se comunica el cliente

Page 9: michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura

// en este caso el puerto es el 4400 servidor = new ServerSocket( 4400 );

System.out.println( "Esperando recepcion de archivos..." ); } public void iniciarServidor() { while( true ) {

try { // Creamos el socket que atendera el servidor Socket cliente = servidor.accept(); // Creamos flujo de entrada para leer los datos que envia el cliente DataInputStream dis = new DataInputStream( cliente.getInputStream() ); // Obtenemos el nombre del archivo String nombreArchivo = dis.readUTF().toString(); // Obtenemos el tamaño del archivo int tam = dis.readInt(); System.out.println( "Recibiendo archivo "+nombreArchivo ); // Creamos flujo de salida, este flujo nos sirve para // indicar donde guardaremos el archivo FileOutputStream fos = new FileOutputStream( "C:\\Users\\MichaelFP\\Documents\\"+nombreArchivo ); BufferedOutputStream out = new BufferedOutputStream( fos ); BufferedInputStream in = new BufferedInputStream( cliente.getInputStream() );

Page 10: michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura

// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura de bytes enviados for( int i = 0; i < buffer.length; i++ ) { buffer[ i ] = ( byte )in.read( ); } // Escribimos el archivo out.write( buffer ); // Cerramos flujos out.flush(); in.close(); out.close(); cliente.close(); System.out.println( "Archivo Recibido "+nombreArchivo ); } catch( Exception e ) { System.out.println( "Recibir: "+e.toString() );

} } } // Lanzamos el servidor para la recepción de archivos public static void main( String args[] ) throws IOException { new RecibirArchivo().iniciarServidor(); }}

Page 11: michaelfp14toros.files.wordpress.com · Web view// Creamos el array de bytes para leer los datos del archivo byte[] buffer = new byte[ tam ]; // Obtenemos el archivo mediante la lectura