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 Socket, OutputStream, DataOutputStream, 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);
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.
¡Mis OJOS!
ResponderEliminarMuy 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.
ResponderEliminarSolo 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:
Eliminarjavac Main.java;
Y después ejecutas:
java Main.java
Y eso sería todo.