Programación en Java

Código fuente. Cliente. Nick. Servidor

  • Enviado por: Ingeniero
  • Idioma: castellano
  • País: España España
  • 11 páginas
publicidad
publicidad

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);

}

}

}