Ingeniero Técnico en Informática de Sistemas
Programación en Java
CODIGO FUENTE
CLIENTE MINICHAT
//IMPORTACIONES DE CLASES
import java.net.*;
//CLASE NET:- PARA APLICACIONES EN RED
import java.io.*;
//CLASE IO:- PARA ENTRADA/SALIDA DE DATOS
import java.util.*;
//CLASE UTIL:- PARA UTILIDADES JAVA
import java.awt.*;
// - PARA CREAR PANTALLAS
import java.awt.event.*;
// - PARA ACTIVAR EVENTOS SOBRE BOTONES etc.
// - CUERPO DEL PROGRAMA
public class minichat extends Frame implements ActionListener{
// - DECLARACION DE VARIABLES PARA PINTAR LA PANTALLA
TextArea textArea1;
Label label1;
Label label2;
TextField textField1;
Button button1;
Button button2;
// - DECLARACION DE VARIABLES UTILIZADAS EN LA APLICACION
Socket conexion=null;
// -VARIABLE conexion DEL TIPO Socket:- ESTA VARIABLE VA A CONTENER
// LA DIRECCIÓN DEL CLIENTE QUE HA CONECTADO.
PrintWriter out;
// -VARIABLE out DEL TIPO PrintWriter:- PARA MANDAR LOS MENSAJES AL
// SERVIDOR
BufferedReader in;
// -VARIABLE in DEL TIPO BufferedReader:- PARA RECIBIR MENSAJES DEL
// SERVIDOR
String id=null;
// -VARIABLE id DEL TIPO String:- VA A CONTENER EL NICK DEL CLIENTE
Ident_Client obj_id;
// -OBJETO DEL TIPO Ident_Cliente;
boolean error=false;
String ser_ip,cad,cadena,servidor=null;
// -VARIABLES AUXILIARES DE TRABAJO
CODIGO FUENTE
CLIENTE MINICHAT
public minichat(String ser)
{
// - TOMAMOS LA DIRECCIÓN IP DONDE SE ESTÁ EJECUTANDO EL SERVIDOR
ser_ip=ser;
// - PINTAMOS LA PANTALLA
setLayout(null);
setBounds(100,10,500,430);
setVisible(true);
setBackground(new Color(12632256));
textArea1 = new TextArea(" ",10,60,1);
textArea1.setBounds(12,60,480,228);
textArea1.setFont(new Font("Dialog", Font.BOLD, 12));
textArea1.setForeground(new Color(1));
textArea1.setBackground(new Color(0));
textArea1.setEditable(false);
add(textArea1);
label1 = new Label("MENSAJES ENVIADOS POR EL
SERVIDOR",Label.CENTER);
label1.setBounds(48,24,384,24);
label1.setFont(new Font("Dialog", Font.BOLD, 16));
label1.setBackground(new Color(32960));
add(label1);
label2 = new Label("Escribe en la siguiente caja el texto a
enviar y pulsa intro.",Label.CENTER);
label2.setBounds(12,312,480,24);
label2.setFont(new Font("Dialog", Font.BOLD, 16));
label2.setBackground(new Color(32960));
add(label2);
textField1 = new TextField();
textField1.setBounds(12,365,384,30);
textField1.setFont(new Font("Dialog", Font.PLAIN, 16));
textField1.setBackground(new Color(16777215));
add(textField1);
button1 = new Button("Enviar");
button1.setBounds(408,348,84,24);
button1.setFont(new Font("Dialog", Font.BOLD, 12));
button1.setBackground(new Color(12632256));
button1.setEnabled(false);
add(button1);
button2 = new Button("Desconectar");
button2.setBounds(408,384,84,24);
button2.setFont(new Font("Dialog", Font.BOLD, 12));
button2.setBackground(new Color(12632256));
button2.setEnabled(false);
add(button2);
// - FIN PINTAR PANTALLA
CODIGO FUENTE
CLIENTE MINICHAT
// - AÑADIMOS LOS ELEMENTOS PARA PODER TRATAR LOS EVENTOS
addWindowListener(new Cerrar());
button1.addActionListener(this);
button2.addActionListener(this);
// - CREAMOS UN NUEVO OBJETO obj_id DEL TIPO Ident_Client
obj_id = new Ident_Client();
// - EJECUTA LA APLICION IDENT_CLIENT HASTA QUE INTRODUZCA NICK
while((id=obj_id.Ident_Client())==null);
// - PONE TÍTULO A LA APLICACIÓN MINICHAT (cliente)
setTitle("IDENTIFICACION CLIENTE: "+id);
// - INTENTAMOS CONECTARNOS AL SERVIDOR
try {
try {
conexion = new Socket(ser_ip,9000);
// Creamos un socket con la dereccion de servidor
conexion.setSoTimeout(1);
// De un tpo máximo de espera
out=new PrintWriter(conexion.getOutputStream(),true);
// Declara corriente de salida del cliente al servidor
in=new BufferedReader(new
InputStreamReader(conexion.getInputStream()));
// Corriente de entrada del servidor al cliente
out.println("JOIN_REQ"+ser_ip);
//enviamos peticion de conexion
}catch (InterruptedIOException ex) {
// - DETECTA TIEMPO DE ESPERA MAXIMA
textArea1.append("Agotado el tiempo de espera");
conexion=null;
error=true;
}catch (UnknownHostException ex) {
// - SE INTENTA CONECTAR A UNA DIRECCION DESCONOCIDA
System.out.println("Servidor desconocido");
System.exit(1);
}
}catch (IOException ex) {
// - EN LA DIRECCION DADA NO SE ESTA EJECUTANDO EL SERVIDOR
textArea1.append("No se puede conectar con el
Servidor. Problemas I/O");
conexion=null;
error=true;
}
CODIGO FUENTE
CLIENTE MINICHAT
if(!error && in!=null) {
//Si no se produce error y nos conectamos al
//servidor activamos botones
button1.setEnabled(true);
button2.setEnabled(true);
textArea1.setText(" ");
}
while(true) {
//bucle que identifica si lo que nos llega del servidor
//es una respuesta de conexion o un mensaje
if(conexion!=null && in!=null) {
try {
cadena=in.readLine();
// En cadena almacena lo que llega del servidor
servidor=cadena.substring(8,cadena.length());
if(cadena.substring(0,8).equals("JOIN_ACK"))
//recibimos respuesta a la peticion de conexion
textArea1.append(servidor+">Aceptada conexion\n");
else if(cadena.substring(0,8).equals("MES_SAGE"))
//pone en entrada la cadena procedente
//del servidor
textArea1.append(cadena.substring(8,cadena.length())+"\n");
}catch(IOException ex) { }
}
}
}
public void actionPerformed(ActionEvent e)
{
String cad = null;
String contenido = e.getActionCommand();
// Almacena en contenido el nombre del boton pinchado
try {
if(contenido.equals("Enviar")) {
//envía la cadena hallada en el campo texto
cad="MES_SAGE"+id+"> "+textField1.getText();
// Envia hacia el servidor la cadena
out.println(cad);
textField1.setText("");
}
CODIGO FUENTE
CLIENTE MINICHAT
if(contenido.equals("Desconectar")){
// - CIERRA LA CONEXION
conexion.close();
in.close();
button1.setEnabled(false);
button2.setEnabled(false);
out.println("LEAVE_REQ"+ser_ip);
out.close();
}
}catch (IOException ex) {
textArea1.append("Problemas I/O en la conexion");
conexion=null;
error=true;
}
}
public static void main(String[] args)
{
try {
if(args.length==0)
// Si no se introduce ninguna direccion IP toma por
// defecto la de la máquina donde se jecuta el cliente
new minichat(InetAddress.getLocalHost().getHostName());
else new minichat(args[0]);
}catch(UnknownHostException e) {}
}
}
class Cerrar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
e.getWindow().dispose();
System.exit(0);
}
}
CODIGO FUENTE
NICK IDENT_CLIENT
// -IMPORTACIÓN DE CLASES
import java.awt.*;
// - PARA CREAR PANTALLAS
import java.awt.event.*;
// - PARA ACTIVAR EVENTOS SOBRE BOTONES etc.
// - CUERPO DEL PROGRA
// - ESTA CLASE LO UNICO QUE HACE ES PEDIR UNA IDENTIFICACIÓN
// AL CLIENTE Y TRATAR DE CONECTAR CON EL SERVIDOR
public class Ident_Client extends Frame implements ActionListener{
// - DECLARACION DE VARIABLES
Label label1;
TextField nick;
Label label2;
Button button1;
Button button2;
Button button3;
String identif = null;
public Ident_Client()
{ // - PINTAMOS LA PANTALLA
setTitle("VENTANA_DE_CONEXION");
setLayout(null);
setBounds(100,10,500,430);
setVisible(true);
setBackground(new Color(4227200));
label1 = new Label("Introduzca identificaci¢n del
Cliente:",Label.CENTER);
label1.setBounds(52,100,216,24);
label1.setForeground(new Color(160));
label1.setBackground(new Color(16756655));
add(label1);
nick = new TextField();
nick.setBounds(280,100,168,24);
nick.setBackground(new Color(0));
nick.setForeground(new Color(16711680));
add(nick);
label2 = new Label("Por favor, introduzca una
identificaci¢n",Label.CENTER);
label2.setVisible(false);
label2.setBounds(90,198,252,24);
label2.setForeground(new Color(16711680));
label2.setBackground(new Color(0));
add(label2);
button1 = new Button("O.K.");
button1.setVisible(false);
button1.setBounds(352,198,50,24);
button1.setFont(new Font("Dialog", Font.BOLD, 16));
CODIGO FUENTE
NICK IDENT_CLIENT
button1.setForeground(new Color(16711680));
button1.setBackground(new Color(0));
add(button1);
button2 = new Button("ACEPTAR");
button2.setBounds(230,234,84,36);
button2.setFont(new Font("Dialog", Font.BOLD, 16));
button2.setBackground(new Color(12632256));
add(button2);
button3 = new Button("C O N E C T A R");
button3.setEnabled(false);
button3.setBounds(74,350,372,24);
button3.setFont(new Font("Dialog", Font.BOLD, 16));
button3.setBackground(new Color(12632256));
add(button3);
// - FIN DE PINTAR PANTALLA
// - AÑADIMOS LOS ELEMENTOS PARA PODER TRATAR LOS EVENTOS
addWindowListener(new Cerrar());
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
}
public String Ident_Client() {
// - DEVUELVE LA IDENTIFICACIÓN DEL CLIENTE
return identif;
}
public void actionPerformed(ActionEvent e){
String contenido = e.getActionCommand();
// - ALMACENA EN contenido LA ETIQUETA
// DEL BOTON PINCHADO
if(contenido.equals("O.K.")) {
label2.setVisible(false);
button1.setVisible(false);
button2.setVisible(true);
}
else if(contenido.equals("ACEPTAR")) {
identif = nick.getText();
if (identif.equals("")){
button2.setVisible(false);
label2.setVisible(true);
button1.setVisible(true);
}
else {
button3.setEnabled(true);
button2.setEnabled(false);
}
}
CODIGO FUENTE
NICK IDENT_CLIENT
else if(contenido.equals("CONECTAR")) {
// - MANDAMOS EL NICK A LA APLICACIÓN DEL CLIENTE
identif = nick.getText();
dispose();
}
}
}
CODIGO FUENTE
SERVIDOR MINICHATD
//IMPORTACIONES DE CLASES
import java.net.*;
//CLASE NET:- PARA APLICACIONES EN RED
import java.io.*;
//CLASE IO:- PARA ENTRADA/SALIDA DE DATOS
import java.util.*;
//CLASE UTIL:- PARA UTILIDADES JAVA
class minichatd {
public static void main( String args[]) throws IOException {
// DECLARACION DE VARIABLES
ServerSocket s;
// -VARIABLE s DEL TIPO ServerSocket:- PARA ESTABLECER UNA
// CONEXION CON UN CLIENTE
String texto;
// -VARIABLE texto DEL TIPO String:- VARIABLE QUE VA A CONTENER
// LA CADENA ENVIADA POR EL CLIENTE.
Socket clientSocket;
// -VARIABLE clientSocket DEL TIPO Socket:- ESTA VARIABLE VA A
// CONTENER LA DIRECCIÓN DEL CLIENTE QUE HA CONECTADO.
// -CUERPO DE LA APLICACION
try {
// INIC. LA VARIABLE s AL PUERTO 9000 (especificado en la práctica)
s = new ServerSocket(9000);
while(true) {
// - EL SERVIDOR ESPERA QUE LE LLEGUE UN CLIENTE Y LA DIRECCIÓN DE
// DICHO CLIENTE ES ALMACENADA EN LA VARIABLE clientSocket.
clientSocket=s.accept();
// - CREAMOS EL TRATAMIENTO DE UN NUEVO CLIENTE
new cliente(clientSocket).start();
}
}catch (IOException e) {
// - SI EL SERVIDOR NO CONECTA CORRECTAMENTE CON ESTE PUERTO SE
// PRODUCE ESTA EXCEPCIÓN
System.out.println("Imposible conectar al puerto 9000");
// - INMEDIATAMENTE INTERRUMPE LA EJECUCION DEL SERVIDOR
System.exit(-1);
}
}
}
CODIGO FUENTE
SERVIDOR MINICHATD
// - EN ESTE MOMENTO, EL SERVIDOR YA ESTÁ FUNCIONANDO.
// - TRATAMIENTO DE LOS DIFERENTES CLIENTES CONECTADOS AL SERVIDOR
class cliente extends Thread{
// - DECLARACION DE VARIABLES PRIVADAS
private Socket clientSocket;
private PrintWriter out;
private BufferedReader in;
private static Vector clientes = new Vector();
public cliente(Socket s) {
// - CREAMOS UN NUEVO CLIENTE
clientSocket=s;
// - LO ALMACENAMOS EN EL VECTOR DE CLIENTES
clientes.addElement(this);
try {
// - CREAMOS DOS VARIABLES:
// - out VA A CONTENER LOS MENSAJES QUE SE LES VA A ENVIAR A LOS CLTS
// - in VA A CONTENER EL MENSAJE QUE UN CLIENTE MANDA AL SERVIDOR
out=new PrintWriter(clientSocket.getOutputStream(),true);
in=new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
}catch(IOException e) { }
}
public void run() {
// - DECLARAMOS UNA VARIABLE BOOLEANA PARA INDICAR LA PERMANENCIA
// DE UN CLIENTE
boolean salir = false;
while(!salir) {
try {
// - ALMACENAMOS EN TEXTO EN MENSAJE ENVIADO POR EL CLIENTE
String texto=in.readLine();
// - COMPROBAMOS SI ES UNA PETICIÓN DE CONEXIÓN
if(texto.substring(0,8).equals("JOIN_REQ"))
// - SI ES ASI, LE MANDAMOS LA CONFIRMACIÓN DE CONEXION
out.println("JOIN_ACK"+InetAddress.getLocalHost().getHostName());
else {
// - COMPROBAMOS SI ES UNA PETICIÓN DE DESCONEXIÓN
if(texto.substring(0,8).equals("LEAVE_REQ")) {
// - SI ES ASÍ CERRAMOS EL Socket
clientSocket.close();
// - BORRAMOS AL CLIENTE DEL VECTOR
clientes.removeElement(this);
CODIGO FUENTE
SERVIDOR MINICHATD
// - INDICAMOS QUE EL CLIENTE A ABANDONADO
salir=true;
}
else if(texto.substring(0,8).equals("MES_SAGE"))
// - SI LO RECIBIDO ES UN MENSAJE SE LO ENVIAMOS A TODOS LOS CLIENTES
this.enviar(texto);
}
}catch(IOException e) {
}catch(NullPointerException e) {
salir=true;
}
}
}
public PrintWriter salida() {
// - ENVIAMOS EL MENSAJE DE SALIDA
return out;
}
private void enviar(String texto) {
cliente cli;
for(int i=0;i<clientes.size();i++) {
// - CREAMOS UN BUCLE PARA MANDAR EL MENSAJE A TODOS LOS CLIENTES
// CONECTADOS
cli = (cliente)clientes.elementAt(i);
// - IGUALAMOS cli A CADA UNO DE LOS CLIENTES DEL VECTOR
cli.salida().println(texto);
}
}
}
Descargar
Enviado por: | Ingeniero |
Idioma: | castellano |
País: | España |