/**
* @(#)mini_chat.java
*
*
* @author tuxwars
* @version 1.00 2011/3/24
*/
import javax.swing.*;//no olvidemos importar las librerias
import java.awt.event.*;
import java.awt.*;
import javax.swing.event.*;
import java.net.*; //Biblioteca para utilizar ServidorSocket
import java.io.*;
/**
* Creates a new instance of <code>mini_chat</code>.
*/
private int contador = 1;
private int temp=1;
private int ban=0;
private static int ClientePuerto;
private static int ServidorPuerto;
public mini_chat() {
//hacemos el frame donde colocaremos el textarea
setSize(500,300);
setTitle("Mini Chat MSN V. 1.3 Alpha");
setLocation(100,100);
setVisible(true);
setLayout(null);
setDefaultCloseOperation(3);
//------------------------------------------------------
add(area);
area.setBounds(250,30,220,200);
/*---------------------------------------------------------*
| hacemos un JScrollPane para poner el textarea en |
| el y asi si el texto es muy grande podremos mover el |
| el area visible y asi poder leer todo el texto |
*---------------------------------------------------------*/
add(ajustar);
ajustar.setBounds(250,30,220,200);
Nom_ip
= new JLabel("Nombre o IP: ");//hacemos el label add(Nom_ip);//lo agregamos el frame
Nom_ip.setBounds(10,10,100,25);//colocamos las coordenadas
//(pos X, pos Y, ancho, alto)
add(n_ip);
n_ip.setBounds(90,10,150,30);
Nom_ip.setVisible(false);
n_ip.setVisible(false);
Num
= new JLabel("No de puerto: ");//hacemos el label add(Num);//lo agregamos el frame
Num.setBounds(10,40,130,40);//colocamos las coordenadas
//(pos X, pos Y, ancho, alto)
add(num_pu);
num_pu.setBounds(90,50,150,30);
add(Servidor);
Servidor.setBounds(10,110,100,40);
Servidor.addChangeListener(this);
add(Cliente);
Cliente.setBounds(120,110,100,40);
Cliente.addChangeListener(this);
grupo.add( Servidor );
grupo.add( Cliente );
boton1
= new JButton("Conectar");//hacemos el boton add(boton1);//lo agremos al frame
boton1.setBounds(10,200,100,40);//colocamos las coordenadas
//(pos X, pos Y, ancho, alto)
boton2
= new JButton("Desconectar");//hacemos el boton add(boton2);//lo agremos al frame
boton2.setBounds(130,200,110,40);//colocamos las coordenadas
//(pos X, pos Y, ancho, alto)
mensaje.setEditable(false);
add(mensaje);
mensaje.setBounds(250,230,220,25);
mensaje.addActionListener(
// enviar mensaje al servidor
{
enviarDatos( evento.getActionCommand() );
mensaje.setText( "" );
}
}
);
//aqui pones el codigo que quieras que se ejecute
//al dar click al boton
//ClienteSocket.close();
if(ban==1){
cerrarConexion(); // Paso 5: cerrar la conexión.
}else{
mostrarMensaje( "Cree una conexion antesn" );
}
ban=0;
}});
}
if (Cliente.isSelected()) {
Nom_ip.setVisible(true);
n_ip.setVisible(true);
new Runnable() { // clase interna para asegurar que la GUI se actualice apropiadamente
public void run() // actualiza areaPantalla
{
//aqui pones el codigo que quieras que se ejecute
//al dar click al boton
//System.out.println("Hola");
ban=1;
ejecutarCliente();
}
}
);
}
});
temp=0;
}
if (Servidor.isSelected()) {
Nom_ip.setVisible(false);
n_ip.setVisible(false);
new Runnable() { // clase interna para asegurar que la GUI se actualice apropiadamente
public void run() // actualiza areaPantalla
{
//aqui pones el codigo que quieras que se ejecute
//al dar click al boton
//System.out.println("Hola");
ban=1;
ejecutarServidor();
}
}
);
}
});
temp=1;
}
}
// configurar y ejecutar el servidor
public void ejecutarServidor()
{
// configurar servidor para que reciba conexiones; procesar las conexiones
try {
// Paso 1: crear un objeto ServerSocket.
ServidorPuerto
=Integer.
parseInt(num_pu.
getText());
for(;;) {
try {
esperarConexion(); // Paso 2: esperar una conexión.
obtenerFlujos(); // Paso 3: obtener flujos de entrada y salida.
procesarConexion(); // Paso 4: procesar la conexión.
}
// procesar excepción EOFException cuando el cliente cierre la conexión
System.
err.
println( "El servidor terminó la conexión" ); }
} // fin de instrucción while
} // fin del bloque try
// procesar problemas con E/S
excepcionES.printStackTrace();
}
} // fin del método ejecutarServidor
// conectarse al servidor y procesar mensajes del servidor
private void ejecutarCliente()
{
// conectarse al servidor, obtener flujos, procesar la conexión
try {
conectarAServidor(); // Paso 1: crear un socket para realizar la conexión
obtenerFlujos(); // Paso 2: obtener los flujos de entrada y salida
procesarConexion(); // Paso 3: procesar la conexión
}
// el servidor cerró la conexión
System.
err.
println( "El cliente termino la conexión" ); }
// procesar los problemas que pueden ocurrir al comunicarse con el servidor
excepcionES.printStackTrace();
}
} // fin del método ejecutarCliente
// conectarse al servidor
{
mostrarMensaje( "Intentando realizar conexiónn" );
servidorChat = n_ip.getText(); // establecer el servidor al que se va a conectar este cliente
// crear Socket para realizar la conexión con el servidor
ClientePuerto
=Integer.
parseInt(num_pu.
getText());
// mostrar la información de la conexión
mostrarMensaje( "Conectado a: " +
cliente.getInetAddress().getHostName() );
}
// esperar que la conexión llegue, después mostrar información de la conexión
{
mostrarMensaje( "Esperando una conexiónn" );
conexion = servidor.accept(); // permitir al servidor aceptar la conexión
mostrarMensaje( "Conexión " + contador + " recibida de: " +
conexion.getInetAddress().getHostName() );
}
// obtener flujos para enviar y recibir datos
{
if(temp==1){
// establecer flujo de salida para los objetos
salida.flush(); // vaciar búfer de salida para enviar información de encabezado
// establecer flujo de entrada para los objetos
mostrarMensaje( "nSe recibieron los flujos de E/Sn" );
}if(temp==0){
// establecer flujo de salida para los objetos
salida.flush(); // vacíar búfer de salida para enviar información de encabezado
// establecer flujo de entrada para los objetos
mostrarMensaje( "nSe recibieron los flujos de E/Sn" );
}
}
// procesar la conexión con el cliente
{
if(temp==1){
// enviar mensaje de conexión exitosa al cliente
String mensaje
= "Conexión exitosa"; enviarDatos( mensaje );
// habilitar campoIntroducir para que el usuario del servidor pueda enviar mensajes
establecerCampoTextoEditable( true );
do { // procesar los mensajes enviados por el cliente
// leer el mensaje y mostrarlo en pantalla
try {
mensaje
= ( String ) entrada.
readObject(); mostrarMensaje( "n" + mensaje );
}
// atrapar problemas que pueden ocurrir al tratar de leer del cliente
mostrarMensaje( "nSe recibió un tipo de objeto desconocido" );
}
} while ( !mensaje.equals( "CLIENTE>>> TERMINAR" ) );
}if(temp==0){
// habilitar campoIntroducir para que el usuario del cliente pueda enviar mensajes
String mensaje
= "Conexión exitosa"; enviarDatos( mensaje );
establecerCampoTextoEditable( true );
do { // procesar mensajes enviados del servidor
// leer mensaje y mostrarlo en pantalla
try {
mensaje
= ( String ) entrada.
readObject(); mostrarMensaje( "n" + mensaje );
}
// atrapar los problemas que pueden ocurrir al leer del servidor
mostrarMensaje( "nSe recibió un objeto de tipo desconocido" );
}
} while ( !mensaje.equals( "SERVIDOR>>> TERMINAR" ) );
}
} // fin del método procesarConexion
// cerrar flujos y socket
private void cerrarConexion()
{
mostrarMensaje( "nFinalizando la conexiónn" );
establecerCampoTextoEditable( false ); // deshabilitar campoIntroducir
try {
salida.close();
entrada.close();
conexion.close();
cliente.close();
}
excepcionES.printStackTrace();
}
}
// enviar mensaje al cliente
private void enviarDatos
( String mensaje
) {
// enviar objeto al cliente
try {
if(temp==1){
salida.writeObject( "SERVIDOR>>> " + mensaje );
salida.flush();
mostrarMensaje( "nSERVIDOR>>> " + mensaje );
}else if(temp==0){
salida.writeObject( "CLIENTE>>> " + mensaje );
salida.flush();
mostrarMensaje( "nCLIENTE>>> " + mensaje );
}
}
// procesar problemas que pueden ocurrir al enviar el objeto
area.append( "nError al escribir objeto" );
}
}
// método utilitario que es llamado desde otros subprocesos para manipular a
// areaPantalla en el subproceso despachador de eventos
private void mostrarMensaje
( final String mensajeAMostrar
) {
// mostrar mensaje del subproceso de ejecución despachador de eventos
new Runnable() { // clase interna para asegurar que la GUI se actualice apropiadamente
public void run() // actualiza areaPantalla
{
area.append( mensajeAMostrar );
area.setCaretPosition(
area.getText().length() );
}
} // fin de la clase interna
); // fin de la llamada a SwingUtilities.invokeLater
}
// método utilitario que es llamado desde otros subprocesos para manipular a
// campoIntroducir en el subproceso despachador de eventos
private void establecerCampoTextoEditable( final boolean editable )
{
// mostrar mensaje del subproceso de ejecución despachador de eventos
new Runnable() { // clase interna para asegurar que la GUI se actualice apropiadamente
public void run() // establece la capacidad de modificar a campoIntroducir
{
mensaje.setEditable( editable );
}
} // fin de la clase interna
); // fin de la llamada a SwingUtilities.invokeLater
}
/**
* @param args the command line arguments
*/
public static void main
(String[] args
) { // TODO code application logic here
mini_chat mn = new mini_chat();
}
}