Páginas

NIMADRES

Hacer un Chat en java (Cliente Servidor) Grafico

  

 El chat (término proveniente del inglés que en español equivale a charla), también conocido como cibercharla, designa una comunicación escrita realizada de manera instantánea mediante el uso de un software y a través de Internet entre dos, tres o más personas ya sea de manera pública a través de los llamados chat's públicos (mediante los cuales cualquier usuario puede tener acceso a la conversación) o privada, en los que se comunican 2 personas y actualmente ya es posible que se comuniquen más de dos personas a la vez.





En esta ocasión les mostrare una pequeña aplicación en la cual se puede implementar un cliente Servidor con SocketOutputStreamDataOutputStream, además, también podrán encontrar un ejemplo de como utilizar un Thread (hilo), y una clase interna que implementa un Runnable.


 El mismo solo es una simulación de como es que se mandan datos a la red, aclarando que este programa solo funciona con red LAN (local). También podrán observar aquellos que tienen dudas de como implementar ActionListener o keyListener, además también puse una imagen con el Logo de Facebook solo para que se vea mas bonito.
   Este (Cliente Servidor) esta programado para enviar Datos a la misma PC, solo para verificación

canalComunicacion = new Socket(InetAddress.getLocalHost()/*"192.168.1.66"*/, 10831);

Donde se muestra que la dirección IP esta comentada y en su lugar se pone InetAddress.getLocalHost(), ya que se necesite conecta a otro host solo lo quitas y pones la dirección IP y listo.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

public final class Chat extends JFrame implements ActionListener,KeyListener{
    private JPanel panelBotones = new JPanel();
    private JPanel panelContenedor = new JPanel(new BorderLayout(1, 2));
    private JLabel labelTitulo;
    private JTextField textoChat = new JTextField("");
    private JTextArea label = new JTextArea("");
    private JButton botonEnviar =  new JButton("Enviar");
    private ImageIcon imagen = new ImageIcon(getClass()
        .getResource("facebook.jpg"));
    public String area = "";
    private boolean metalera = false;
    
    public Chat(){
        titulo();
        setBounds(250,100,357,500);
        setTitle("Chat");
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        mensajeEntrada entrada =  new mensajeEntrada();
        Thread t =  new Thread(entrada);
        t.start();
    }
    @Override
    public void actionPerformed(ActionEvent e){
        if(e.getSource().equals(botonEnviar)){
            if(textoChat.getText().equals(""))
                metalera = false;
            else
                metalera = true;            
            if(metalera)
                mensageSalida();
            textoChat.setText("");
        }
    }
    @Override
    public Image getIconImage() {
        Image iconoVentana = Toolkit.getDefaultToolkit().
        getImage(ClassLoader.getSystemResource("icono.png"));
        return iconoVentana;
    }
    public void titulo(){
        labelTitulo = new JLabel();
        labelTitulo.setIcon(imagen);add(labelTitulo,BorderLayout.NORTH);
        panelContenedor.add(textoChat,BorderLayout.CENTER);
        add(new JScrollPane(label), BorderLayout.CENTER);
        panelBotones.setBackground(java.awt.Color.BLUE);
        panelBotones.setLayout(new BorderLayout());
        panelBotones.add(botonEnviar,BorderLayout.EAST);
        panelContenedor.add(panelBotones,java.awt.BorderLayout.SOUTH);
        botonEnviar.addActionListener(this);
        add(panelContenedor,java.awt.BorderLayout.SOUTH);
        label.setEditable(false);
        label.setFont(new Font("Tahoma", 3, 12));
        setIconImage(getIconImage());
        textoChat.addKeyListener(new KeyAdapter(){
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode()==KeyEvent.VK_ENTER){
                    if(textoChat.getText().equals(""))
                        metalera = false;
                    else
                        metalera = true;
                    if(metalera)
                        mensageSalida();
                    textoChat.setText("");
                }
            }
        });
    }

    @Override
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyPressed(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    public void mensageSalida(){
        try {
            Socket canalComunicacion = null;
            OutputStream bufferSalida;
            DataOutputStream datos;
            canalComunicacion = new Socket(
                InetAddress.getLocalHost()/*"192.168.1.66"*/, 10831);
            bufferSalida = canalComunicacion.getOutputStream();
            datos = new DataOutputStream(bufferSalida);
            label.setText(textoChat.getText());
            area += "Paracoccidio dice: \n  " + label.getText()+ "\n";
            label.setText(area);
            datos.writeUTF("Paracoccidio dice: \n  " + textoChat.getText());
            datos.writeUTF("");
            textoChat.setText("");
            datos.close();
            bufferSalida.close();
            canalComunicacion.close();
        } catch (UnknownHostException ex) {
            Logger.getLogger(Chat.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Chat.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    class mensajeEntrada implements Runnable{
        @SuppressWarnings("SleepWhileInLoop")
        @Override
        public void run(){
            while(true){
                ServerSocket puerto = null;
                try {
                    puerto = new ServerSocket(10831);
                } catch (IOException ex) {
                    Logger.getLogger(Chat.class.getName())
                        .log(Level.SEVERE, null, ex);
                }
                while(true){
                    try {
                        DataInputStream datos;
                        InputStream bufferEntrada = null;
                        Socket canalComunicacion = null;
                        canalComunicacion = puerto.accept();
                        bufferEntrada = canalComunicacion.getInputStream();
                        datos = new DataInputStream(bufferEntrada);
                        @SuppressWarnings("RedundantStringConstructorCall")
                        String cadena = area;
                        label.setText(datos.readUTF());
                        area  += label.getText() + "\n";
                        label.setText(area);
                        datos.close();
                        bufferEntrada.close();
                        canalComunicacion.close();
                    } catch (IOException ex) {
                        Logger.getLogger(Chat.class.getName())
                            .log(Level.SEVERE, null, ex);
                    } 
                }
            }
        }
    }
}
Ahora solo les dejo el Archivo Main.java y esta listo para Compilar desde Consola o Terminal.
import javax.swing.UIManager;
public class Main {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {}
        java.awt.EventQueue.invokeLater(new Runnable(){
            @Override
            public void run(){
                new Chat().setVisible(true);
            }
        });
    }
}
Con esto solo faltan las imágenes que elegí yo para la aplicación  estas ustedes las pueden cambiar para codificarlo mejor, igual las dejo aquí abajo.





3 comentarios:

  1. Muy bien explicado. El amigo me pasas los archivos de este chat para poder estudiarlo ya q quiero presentarlo como un proyecto por favor mi correo patricio_p120@hotmail.com o patricio.piguave@gmail.

    ResponderEliminar
    Respuestas
    1. Solo copia el código, pégalo en un archivo "Chat.java" y "Main.java", los dos juntos en una carpeta, también las imágenes. De ahí, solo compila desde la consola:

      javac Main.java;

      Y después ejecutas:

      java Main.java

      Y eso sería todo.

      Eliminar