Atom Blog

Como Hacer un Chat con Sockets en Java en Netbeans


En este nuevo post mostraremos como hacer un chat mediante el uso de Sockets en Java en el ambiente de programacion Netbeans. Los Sockets sirven para comunicar procesos de diferentes maquinas de una red.

Haremos un servidor y un cliente utilizando Sockets.

Del lado del Servidor se tiene un bucle infinito que espera conexiones de clientes. Cuando un cliente se conecta el servidor acepta la conexion y genera dos threads: uno para enviar datos y el otro para recibirlos.

Del lado del Cliente se tiene que esperar un Servidor para poder conectarse, cuando se conecta al servidor se generan dos threads, al igual que en el Servidor uno para enviar y otro para recibir los datos.

Los threads que se generan del lado del servidor y del cliente son los mismos.
La clase principal del Servidor es identica a la clase principal del cliente; la unica diferencia esta en el main, el servidor espera conexiones del cliente y el cliente busca servidor para conectarse.

Para nuestro ejemplo utilizaremos localhost para poder correr el programa en nuestra propia maquina.

Es importante tener en cuenta que puerto se va a utilizar para poder abrirlo con anterioridad, en nuestro caso abriremos el puerto 11111.

Se debe conocer que las asignaciones a los puertos comprendidos entre los valores (0 - 1023) estan determinados por la IANA (Internet Assigned Numbers Authority). y no se los puede utilizar de otro manera.

Se puede utilizar los puertos comprendidos entre los valores (1024 - 65535). 

Nuestro programa cuenta con dos paquetes, uno para el servidor y otro para el cliente; los mismo que contiene threads identicos para envio y recepcion de datos.

Empezaremos describiendo las clases del lado del servidor:

Clase PrincipalChat:
Esta clase implementa la interfaz grafica para poder mostrar los mensajes entrantes y un JTextField para poder enviarlos. La interfaz contiene un menu para poder salir del programa.
En el main se puede ver que se espera conexiones de clientes.


Clase ThreadEnvia:
En esta clase establecemos nuestro canal de salida tipo ObjectOutputStream, el cual nos sirve para escribir el mensaje, enviarlo y mostrarlo en pantalla mediante el metodo enviarDatos().
Ademas declaramos la variable conexion tipo Socket, la cual se encarga de establecer el flujo de datos entre  cliente y servidor.

Clase ThreadRecibe:
En esta clase establecemos nuestro canal de entrada tipo ObjectInputStream, el cual se encarga de recibir los mensajes enviados por el cliente o servidor.
Aqui se procesa los mensajes recibidos y luego son mostrados en pantalla.
Es importante aclarar que se debe cerrar el canal de entrada de datos y el Socket de conexion una vez finalizado el flujo de datos.

En el paquete Cliente encontramos:

Clase PrincipalChat:
Esta clase implementa la interfaz grafica para poder mostrar los mensajes entrantes y un JTextField para poder enviarlos. La interfaz contiene un menu para poder salir del programa.
Esta clase busca servidores para poder conectarse.

Las clases descritas en el paquete Cliente: ThreadRecibe y ThreadEnvia son exactamente las mismas que se describieron en el paquete Servidor.

Nuestro proyecto se vera asi:


El resultado final se mostrara de la siguiente manera:

Para descargar el proyecto completo click en la siguiente imagen:

Skydrive

Dropbox







Como Insertar una Imagen a un JLabel desde URL


En este post indicaremos como insertar una imagen  como icono en un JLabel. Ademas se insertara un scroll para que la imagen aparezca independiente del tamaño.

La imagen a insertar sera tipo .jpg; se pueden utilizar imagenes con extensiones .png, jpg, gif.

En codigo descrito a continuacion establece un JFrame, sobre el cual se insertara un JLable, donde finalmente se pegara una imagen obtenida a traves de una URL.
JFrame>>JLabel>>imagen

Nuestro primer paso es declarar la URL:
URL url = new URL("http://www.info-centro-24.com/documents/admin/uploads/classifieds/img-45-                     30867-original.jpg");

Seguido de esto se guardara la URL sobre una variable tipo Imagen.
Image image = ImageIO.read(url);

A continuacion se crea el JLabel donde se pegara la variable "image" tipo Imagen, estableciendola como ImageIcon();
JLabel label = new JLabel(new ImageIcon(image));

Nuestro ultimo paso es crear el Scroll y agregarlo al JLabel.

JScrollPane scroll = new JScrollPane(label);
add(scroll);

No olvidarse que en nuestro main tendremos que establecer el JFrame como visible, establecer un tamano para el mismo, de la siguiente manera:
ImagenURL imagen = new ImagenURL();
imagen.setSize(400, 400);
imagen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
imagen.setVisible(true);
imagen.setLocationRelativeTo(null);

La salida de nuestro programa quedara de la siguiente manera:

El codigo se presenta a continuacion:
Podemos descargarnos el proyecto, click en la siguiente imagen:



Manejo de Ventanas en Java Netbeans

Manejo de Ventanas en Java usando Netbeans 7.1

En este nuevo ejemplo mostraremos a utilizar ventanas en Netbeans 7.1: ventanas para ingresar datos, ventanas para listar datos, enlazamiento de varias ventas, manejo de botones,  JButton.
Ademas se va a utilizar menus para una ventana principal.

La ventana principal es de tipo Formulario JFrame, las otras ventanas seran de tipo Formulario JDialog.

Nuestro problema consiste en lo siguiente:
Se desea disenar un programa que permita ingresar estudiantes a una lista, especificando su numero de cedula, nombre, apellido, edad y 3 notas correspondientes a los tres periodos del ano lectivo, ademas se mostrara el promedio total y el estado (Aprobado, Reprobado).

Solucion:
El problema se ha dividido en 5 clases desarrolladas a continuacion.

Estudiante:
Para la solucion del problema se crea nuestra primera clase llamada Estudiante, la que contendra los atributos que tiene el mismo tal como: cedula, nombre, apellido, edad, etc.
Ademas esta clase contiene los metodos setters y getters para la utilizacion de los atributos.



GestorEstudiante:
Contiene el metodo ingresarEstudiante() que permite anadir un nuevo estudiante a la lista.


ventanaAgregarEstudiante:
Esta clase es una ventana de tipo Formulario JDialog.
Se presenta de la siguiente manera:


Esta clase tambien contiene los metodos: calcularPromedio() tipo float que retorna el prometio a mostrar en la tabla y el metodo establecerEstado() tipo String que retorna el estado (Aprobado o Reprobado) del estudiante.



ventanaListarEstudiantes:
Esta clase contiene una tabla, en la cual se mostraran los estudiantes ingresados.
Es de tipo Formulario JDialog.
Se presenta de la siguiente manera:

En esta clase se encuentra el metodo llenarDatosTabla(), el cual permite escribir sobre la tabla la informacion obtenida del usuario.



ventanaPrincipal:
Es de tipo Formulario JFrame.
Esta clase contiene los menus como archivo y edicion, asi como los submenus como salir, agregar estudiante y listar estudiante. Al presionar algun item de los nombrados se enlazara a la ventana correspondiente.
Se presenta de la siguiente manera:
El codigo es el siguiente:


Para descargar el proyecto completo click en la siguiente imagen:
-Skydrive

-Dropbox






Uso de CheckBox y Button en Java


En este nuevo ejemplo se explicara la utilizacion de los CheckBox y los Button en Java, mediante la utilizacion de Netbeans 7.1.

Para la utilizacion de los Checkbox sera necesario importar el paquete de awt "java.awt.Checkbox".
import java.awt.Checkbox;

Para la utilizacion de los Button es necesario importar el paquete de swing "javax.swing.JButton".
import javax.swing.JButton;

Para nuestro ejemplo utilizaremos 4 CheckBox y dos Button:


Se empezara declarando los CheckBox y los Button de la siguiente manera:
private JButton botonGuardar;
private JButton botonSalir;
private Checkbox checkBox1;
private Checkbox checkBox2;
private Checkbox checkBox3;
private Checkbox checkBox4;

Luego, en el constructor se creara los button y los CheckBox y se les asignara un nombre. Ademas se inicializara en falso los Checkbox.

botonGuardar = new JButton("Guardar");
botonSalir = new JButton("   Salir   ");      
checkBox1 = new Checkbox("checkBox1", false);
checkBox2 = new Checkbox("checkBox2", false);
checkBox3 = new Checkbox("checkBox3", false);
checkBox4 = new Checkbox("checkBox4", false);

Continuaremos adicionando los button y Checkbox al panel:

add(checkBox1);
add(checkBox2);
add(checkBox3);
add(checkBox4);
add(botonGuardar);
add(botonSalir);

Establecemos el tamano del panel y lo ponemos visible:

setSize(170, 220);
setVisible(true); 

Se ha creado un metodo que controla los eventos que se realizan al presionar los botones (Guardar y Salir) y los eventos ocasionados al hacer check en alguno de los 4 Checkbox.

public void manejadorEventos(){
        botonGuardar.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                if(checkBox1.getState()==true){
                    JOptionPane.showMessageDialog(null, "Se hizo check en el checkBox1");
                }
                if(checkBox2.getState()==true){
                    JOptionPane.showMessageDialog(null, "Se hizo check en el checkBox2");
                }
                if(checkBox3.getState()==true){
                    JOptionPane.showMessageDialog(null, "Se hizo check en el checkBox3");
                }
                if(checkBox4.getState()==true){
                    JOptionPane.showMessageDialog(null, "Se hizo check en el checkBox4");
                }
            }
        });
        
        botonSalir.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                System.exit(0);
            }
        });
}


A continuacion se publica el ejemplo:


Resultados:

Al hacer check en el Checkbox1 y despues presionar en el boton "Guardar", el programa realizara la siguiente tarea:

Al hacer check en el Checkbox2 y despues presionar en el boton "Guardar", programa realizara la siguiente tarea:

Y asi sucesivamente.....

Y al presionar en el boton "Salir", se cerrara el programa.