You are on page 1of 12

package com.deitel.messenger.sockets.servidor; import java.util.*; import java.net.*; import java.oi.*; import com.deitel.messenger.*; import com.deitel.messenger.sockets.

*; public class ServidorDeitelMessenger implements EscuchaMensajes { public void iniciarServidor() { try{ ServerSocket socketServidor = new ServerSocket( ConstantesSocketMessenger.PUERTO_SERVIDOR, 100); System.out.println("Servidor escuchando en el puerto" + ConstantesSocketMessenger.PUERTO_SERVIDOR + "..."); while(true) { Socket socketCliente = socketServidor.accept(); new SubprocesoReceptor(this, socketCliente).start(); System.out.println("Conexion recibida de: " + socketCliente.getInetAddress()); } } catch(IOException excepcionES) { excepcionES.printStackTrace(); } } public void mensajeRecibido(String de, String mensaje) { String mensajeCompleto = de + ConstantesSocketMessenger.SEPARADOR_MENSAJE + mensaje; new SubprocesoEnvioMulticast(mensajeCompleto.getBytes() ).start(); } public static void main(String args[]) { new SerDeitelMessenger().iniciarServidor(); } } ------------------------------------------------------package com.deitel.messenger.sockets; public interface ConstantesSocketMessenger{ public static final String DIRECCION_MULTICAST = "239.0.0.1"; public static final int PUERTO_ESCUCHA_MULTICAST = 5555; public static final int PUERTO_ENVIO_MULTICAST = 5554; public static final int PUERTO_SERVIDOR = 12345;

public static final String CADENA_DESCONEXION = "DESCONECTAR"; public static final String SEPARADOR_MENSAJE = ">>>"; public static final int TAMAO_MENSAJE = 512; } ---------------------------------------------------package com.deitel.messenger; public interface EscuchaMensajes { public void mensajeRecibido (String de, String mensaje); } ------------------------------------------------------package com.deitel.messenger.sockets.servidor; import java.io.*; import java.net.*; import java.util.StringTokenizer; import com.deitel.messenger.*; import com.deitel.messenger.sockets.*; public class subprocesoReceptor extends Thread { private BufferedReader entrada; private EscuchaMensajes escuchaMensajes; private boolean seguirEscuchando = true; public SubprocesoReceptor(EscuchaMensajes escucha, Socket socketCliente) { super("SubprocesoReceptor: " + socketCliente); escuchaMensajes = escuha; try { socketCliente.setSoTimeout(5000); entrada = new BufferedReader(new InputStreamReader ( socketCliente.getInputStream() ) ); } catch(IOException excepcionES ) { excepcionES.printStackTrace(); } } public void run () { String mensaje; while(seguirEscuchando) { try{ mensaje = entrada.readLine();

} catch(InterruptedIOException excepcionInterrupcion ) { continue; } catch(IOException excepcionES) { excepcionES.printStackTrace(); break; } if(mensaje != null) { StringTokenizer tokenizer = new StringTokenizer( mensaje, ConstantesSocketMessenger.SEPARADOR_MENSAJE); if(tokenizer.countTpkens() == 2) escuchaMensajes.mensajeRecibido( tokenizer.nextToken(), tokenizer.nextToken() ); else if(mensaje.equalsIgnoreCase( ConstantesSocketmessenger.SEPARADOR_MENSAJE + ConstantesSocketMessenger.CADENA_DESCONEXION ) ) dejarDeEscuchar(); } } try{ entrada.close(); } catch (IOException excepcionES ) { excepcionES.printStackTrace(); } } public void dejarDeEscuchar() { seguirEscuchando = false; } } ------------------------------------------------package com.deitel.messenger.sockets.servidor; import java.io.*; import java.net.*; import com.deitel.messenger.sockets.*; public class SubprocesoEnvioMulticast extends Thread { private byte[] bytesMensaje;

public SubprocesoEnvioMulticast(byte[] bytes) { super("SubprocesoEnvioMulticast"); bytesMensaje =bytes; } public void run() { try{ DatagramSocket socket = new datagramSocket( ConstantesSocketMessenger.PUERTO_ENVIO_MULTICAST); InetAddress grupo = InetAddress.getByName( ConstantesSocketMessenger.DIRECCION_MULTICAST); DatagramPacket paquete = new DatagramPacket( bytesMensaje, bytesmensaje.length, grupo, ConstantesSocketMessenger.PUERTO_ESCUCHA_MULTICAST); socket.send(paquete); socket.close(); } catch (IOException excepcionES) { excepcionES.printStackTrace(); } } } --------------------------------------------------package com.deitel.messenger; public interface AdministradorMensajes{ public void conectar(EscuchaMensajes escucha); public void desconectar(EscuchaMensajes escuha); public void enviarmensajes(String de, String mensaje); } -----------------------------------------------package com.deitel.messenger.sockets.cliente; import java.util.*; import java.net.*; import java.io*; import com.deitel.messenger.*; import com.deitel.messenger.sockets.*; public class AdministradorSocketsMensajes implements AdministradorMensajes { private Socket socketCliente; private String direccionServidor; private SubprocesoReceptorPaquetes subprocesoReceptor; private boolean conectado = false;

public AdministradorSocketsMensajes(String direccion) { direccionServidor = direccion; } public void conectar(EscuchaMensajes escucha) { if(conectado) return; try{ socketCliente = new Socket( InetAddress.getByName( direccionServidor), ConstantesSocketMessenger.PUERTO_SERVIDOR); subprocesoReceptor = new SubprocesoReceptorPaquetes (escucha); subprocesoReceptor.start(); conectado = true; } catch (IOException excepcionES) { excepcionES.printStackTrace(); } } public void desconectar(EscuchaMensajes escucha) { if(!conectado) return; try{ Thread desconectarSubproceso = new SubprocesoEmisor(socketCliente, "", ConstantesSocketmessenger.CADENA_DESCONEXION); desconectarSubproceso.start(); desconectarSubproceso.join(10000); subprocesoReceptor.dejarDeEscuchar(); socketCliente.close(); } catch(IOException excepcionES) { excepcionES.printStackTrace(); } catch(InterruptedException excepcionInterrupcion) { excepcionInterrupcion.printStackTrace(); } conectado=false; } public void enviarMensaje/Stringde, String mensaje) { if(!conectado) return;

new SubprocesoEmisor(socketCliente, de, mensaje).start(); } ---------------------------package com.deitel.messenger.sockets.cliente; import java.io.*; import java.net.*; import com.deitel.messenger.sockets.*; public class SubprocesoEmisor extendes Thread { private Socket socketCliente; private String mensajeAEnviar; public SubprocesoEmisor(Socket socket, String nombreUsuario, String mensaje ) { super("SubprocesoEmisor: " + socket); socketCliente = socket; mensajeAEnviar = nombreUsuario + ConstantesSocketMessenger.SEPARADOR_MENSAJE + mensaje; } public void run() { try{ PrintWriter escritor = new PrintWriter(socketCliente.getOutputStream() ); escritor.println(mensajeAEnviar); escritor.flush(); } catch(IOException excepcionES) { excepcionES.printStackTrace(); } } ------------------------------------------------package com.deitel.messenger.sockets.cliente; import java.io.*; import java.net.*; import java.util.*; import com.deitel.messenger.*; import com.deitel.messenger.sockets.*; public class SubprocesoReceptorPaquetes extends Thread { private EscuchaMensajes escuchaMensajes;

private MulticastSocket socketMulticast; private InetAddress grupoMulticast; private boolean seguirEscuchndo = true; public SubprocesoReceptorPaquetes(EscuchaMensajes escucha) { super("SubprocesoReceptorPaquetes"); escuchaMensajes = escucha; try{ socketMulticast = new MulticastSocket( ConstantesSocketMessenger.PUERTO_ESCUCHA_MULTICAST); grupoMulticast = InetAddress.getByName( ConstantesSocketMessenger.DIRECCION_MULTICAST); socketMulticast.joinGroup(grupoMulticast); socketMulticast.setSoTimeout(5000); } catch(IOException excepcionES9{ excepcionES.printStackTrace(); } } public void run() { while(seguirEscuchando){ byte[] bufer = new byte[ConstantesSocketMessenger.TAMANIO_MENSAJE]; datagramPacket paquete = new DatagramPacket(bufer, ConstantesSocketMessenger.TAMANIO_MENSAJE); try{ socketMulticast.receive(paquete); } catch(InterruptedIOException excepcionESInterrupcion) { continue; } catch(IOException excepcionES) { excepcionES.printStackTrace(); break; } String mensaje = new String(paquete.getData() ); mensaje = mensaje.trim(); StringTokenizer tokenizer = new stringTokenizer( mensaje, ConstantesSocketMessenger.SEPARADOR_MENSAJE); if(tokenizer.countTokens() == 2)

escuchaMensajes.mensajeRecibido( tokenizer.nextToken(), tokenizer.nextToken() ); } try{ socketmulticast.leaveGroup(grupoMulticast); socketMulticast.close(); } catch(IOException excepcionES){ excepcionES.printStackTrace(); } } public void dejarDeEscuchar() { seguirEscuchando = false; } } -------------------------------------------------package com.deitel.messenger; import java.io.*; import hava.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class GUICliente extends JFrame{ private JMenu menuServidor; private JTextArea areaMensajes; private JTextArea areaintroducir; private private private private JButton botonConectar; JMenuItem elementoMenuConectar; JButton botonDesconectar; JMenuItem elementoMenuDesconectar;

private JButton botonEnviar; private private private private JLabel barraEstado; String nombreUsuario; AdministradorMensajes administradorMensajes; EscuhaMensajes escuhamensajes;

public GUICliente(AdministradorMensajes administrador) { super("Deitel Messenger"); administradorMensajes = administrador; escuchaMensajes = new MiEscuchaMensajes(); menuServidor = new JMenu ("Servidor"); menuServidor.setMnemonic('S'); JMenuBar barraMenus = new JMenuBar();

barraMenus.add(menuServidor); setJMenuBar(barraMenus); botonConectar = new Jbutton("Conectar"); elementoMenuConectar = new JMenuItem("Conectar"); elementoMenuConectar.setMnemonic('C'); ActionLestener escuchaConectar = new EscuchaConectar(); botonConectar.addActionListener(escuchaConectar); elementoMenuConectar.addActionListener(escuchaConectar); botonDesconectar = new JButton("Desconectar"); elementoMenuDesconectar = new JMenuItem ("Desconectar"); elementoMenuDesconectar.setMnemonic('D'); botonDesconectar.setEnabled(false); elemtoMenuDesconectar.setEnabled(false); ActionListened escuchaDesconectar = new EscuchaDesconectar(); botonDesconectar.addActionListener(escuchaDesconectar); elementomenuDesconectar.addActionListener(escuchaDesconectar); menuServidor.add(elementoMenuConectar); menuServidor.add(elemtoMenuDesconectar); JPanel panelBotones = new JPanel(); panelBotones.add(botonConectar); panelBotones.add(botondesconectar); areaMensajes = new JTextArea(); areaMensajes.setEditable(false); areaMensajes.setWrapStyleWord(true); areaMensajes.setLineWrap(true); JPanel panelMensajes = new JPanel(); panelMensajes.setLayout(new BorderLayout(10, 10)); panelMensajes.add(new JScrollPane(areaMensajes), BorderLayout.CENTER); areaIntroducir = new JTextArea(4, 20); areaIntroducir.setWrapStyleWord(true); areaIntroducir.setLineWrap(true); areaIntroducir.setEditable(false); botonEnviar = new JButton("Enviar"); botonEnviar.setEnabled(false); botonEnviar.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent evento) { administradorMensajes.enviarMensaje(nombreUsuario, areaIntroducir.gettext()); areaIntroducir.setText(""); } } );

Box cuadro = new Box(BoxLayout.X_AXIX); cuadro.add(new JScrollPane(areaIntroducir)); cuadro.add(botonEnviar); panelMensajes.add(cuadro,BorderLayout.SOUTH); barraEstado = new JLabel("Sin conexion"); barraEstado.setBorder(new BevelBorder(BevelBorder.LOWERED)); Container contenedor = getContentPane(); contenedor.add(panelBotones, BorderLayout.NORTH); contenedor.add(panelMensajes, BorderLayout.CENTER); contenedor.add(barraEstado, BorderLayout.SOUTH); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent evento) { administradorMensajes.desconectar(escuchaMensajes); System.exit(0); } } ); } private classEscuchaConectar implements ActionListener { public void actionPerformed(ActionEvent evento) { administradorMensajes.conectar(escuchamensajes); nombreUsuario = JOptionPane.showInputDialog( GUICliente.this, "Escriba el nombre de usuario"); areaMensajes.setText(""); botonConectar.setEnabled(false); elementomenuConectar.setEnabled(false); botonDesconectar.setEnabled(true); elementoMenudesconectar.setEnabled(true); botonEnviar.setEnabled(true); areaintroducir.setEditabled(true); areaIntroducir.requestFocus(); barraestado.settext("Conectado: " + nombreUsuario); } } private class escuchadesconectar implements ActionListener{ public void actionPerformed(ActionEvent evento) { administradorMensajes.desconectar(escuchaMensajes); botonEnviar.setEnabled(false); botonDesconectar.setEnabled(false); elementomenuDesconectar.setEnabled(false); areaIntroducir.setEditable(false); botonConectar.setEnabled(true); elementomenuConectar.setEnabled(true); barraEstado.setText("Sin conexion"); } }

private class MiEscuchaMensajes implements EscuchaMensajes { public void mensajeRecibido(String de, String mensaje) { Swingutilities.invokeLater( new MostradorMensajes(de, mensaje)); } } private class mostradorMensajes implements Runnable{ private String deUsuario; private String cuerpoMensaje; public MostradorMensajes(String de, String cuerpo) { deUsuario = de; cuerpoMensaje = cuerpo; } public void run() { areaMensajes.append("\n" + deusuario + "> " + cuerpoMensaje); areaMensajes.setcaretPosition(areaMensajes.getText().length() ); } } } ------------------------------------------------package com.deitel.messenger.sockets.cliente; import com.deitel.messenger.*; public class Deitelmessenger { public static void main(String args[]) { AdministradorMensajes administradorMensajes; if(args.lenhth == 0) administradorMensajes = new AdministradorSocketMensajes("localhost"); else administradorMensajes = new AdministradorSocketMensajes(args[0]); GUICliente guiCliente = new GUICliente(administradorMensajes); guiCliente.setSize(300, 400); guiCliente.setResizable(false); guiCliente.setVisible(true); } }

V2C47-MK7JD-3R89F-D2KXW-VPK3J DHXQ2-WRGCD-WGYJY-HHYDH-KKX9B B77QF-DP27W-4H68R-72B48-78RPD THMPV-77D6F-94376-8HGKG-VRDRQ CFDYK-FFHH7-QW3HM-JGRQX-KM77T D27M3-JCB9R-2K26P-492TP-JGFH8 P4XK3-TGQ3P-F9JB2-GC6XQ-VXTMW

You might also like