Max Hernandez

Laberinto - Ejemplo de Canvas en HTML5

domingo, 5 de septiembre de 2010

Programa Cliente Servidor en Java


Buen día a todos.

Esta publicación tiene la intención de mostrar un programa simple que construí acerca del juego muy conocido por todos Piedra, Papel y Tijeras. El código esta basando en el programa Chat de la Doctora Elisa y PPT tambien de ella que se pueden encontrar al final de la publicación.























El programa esta dividido en los siguientes tres archivos.

Este es el archivo "Client.java".

package PPT;
 
import java.util.Scanner;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
 
public class Client extends Principal { 
 
 public Client(String name) { // Constructor recibe el nombre y pues revisar constructor de principal para saber que hace con este
    super(name);
    }
     
    public void actionPerformed( ActionEvent e){ // redefine esta funcion para que solo envie la informacion, todo lo logico lo hace el servidor
    String cmd = e.getActionCommand(); 
    if (cmd == "Piedra"){
    this.envia.println("1");
    return;
    }
    if (cmd == "Papel"){
    this.envia.println("2");
    return;
    }
    if (cmd == "Tijeras"){
    this.envia.println("3");
    return;
    }
    }
     
    protected boolean lector() { // todo lo que le llegue lo imrpime en la pantalla
    try {
        String s = this.recibe.readLine().trim();
        if (s != null) {
            System.out.println(" Mensaje recibido "+s);
            this.Texto.append(s + "\n");
            super.repaint();
         
        } 
    } catch (Exception e) {}
    return true;
    }
     
     
     
    public static final Scanner into =  // Scaner para escibir el ip y el nombre en el CMD
    new Scanner(System.in);
     
    public static void main(String[] args) {
    // nombre, puerto y servidor(iP)
    String direccion, puerto;
    System.out.print(" Introduza El Puerto \n >>");
    puerto = Server.into.next();
    System.out.print(" Introduza El IP \n >>");
    direccion = Server.into.next();
    System.out.print(" Introduza Su Nombre \n >>");
    Client cc = new Client("Cliente - "+Server.into.next()); // nuevo objeto cliente que y le manda el nombre del jugador ala funcion constructora
    try {
        cc.corre(Integer.parseInt(puerto), direccion); // le manda el puerto y la direccion ala funcion corre que despues manda la informaciona abrirflujo que abre un socket
    } catch (Exception e) {
        System.err.println("No se pudo establecer la conexion talves este mal el puerto o la Ip");//ERROR -.-
    }
    }
 
    private void corre(int puerto, String servidor)  // recibe puerto e IP
    throws IOException {
     
        try {
        super.abrirFlujo(new Socket(servidor, puerto)); // Configura el socket y lo abre
        } catch (UnknownHostException e) { 
            System.err.println("Desconozco el servidor " +
                   servidor + ".");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("No se pudo conectar a " + // No se puedo conectar se sale
                   servidor + ".");
            System.exit(1);
        } catch (Exception e) {
        System.err.println("Algo no funciona.");
            System.exit(1);
        }
     
        while (true) { // cicla hasta que manden falso pero no puse ningun comando para eso o.0
        try {
        Thread.sleep(200);// duerme. asi no se gasta toda la potencia de la computadora
        } catch (Exception e) {}
        if (!this.lector()) { // manda a lector quien verifica si se ha mandandado algo
        break;
        }
    }
    super.cerrarFlujo(); // se cierran los buffers 
    return;
    }
     
}


Este es el archivo "Server.java".

package PPT;
import java.util.Scanner;
import java.net.*;
import java.io.*;
 
public class Server extends Principal { // Extiende aprincipañ
 
     public Server(String name) {// el metodo constructor que recibe el nombre
    super(name);
    }
     
    public void corre(int puerto) { // 
    ServerSocket servidor = null;
    Socket entrante = null;
    BufferedReader recibes = null;
    String entrada = null;
     
    try {
        servidor = new ServerSocket(puerto); // nuevo socket para servidor
    } catch (IOException e) {
        System.err.println("No se pudo " + 
                   "escuchar al puerto " + 
                   puerto + ".");
    }
     
    // aceptar una conexion entrante
        try {
        System.out.println("Listo para aceptar " + 
                   "una conexion al puerto "
                   + puerto + ".");
 
        super.abrirFlujo(servidor.accept()); // esto no estoy seguro para que sirve me lo copie de la doc pero supongo que solo conecta el socket servidor con el printwriter y bufferReader
        while (true) { 
        try {
            Thread.sleep(200);
        } catch (Exception e) {}
        if (!super.leer()) { // manda  ala funcion leer
            break;
        }
        }
        super.cerrarFlujo(); // cierra el socket
        servidor.close();// cierra los bufers
         
    } catch (Exception e) {
        System.err.println("Hubo pleito:"); // Errores
        e.printStackTrace();
    }
     
    System.exit(-1);
    return;
    }
     
     
    public static final Scanner into =  // escaner para el nombre y el puerto
    new Scanner(System.in);
     
    public static void main(String[] args) { 
    System.out.print(" Introduza El Puerto \n >>");
    String puerto = Server.into.next();
    System.out.print(" Introduza su nombre \n >>");
    Server cs = new Server("Servidor - " +  Server.into.next()); // se crea un objeto servidor
    cs.corre(Integer.parseInt(puerto));
    return;
    }
}


Este es el archivo "Principal.java"

package PPT; // paquete PPT
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*; // Libreria para el BufferReader y el printWriter 
import java.net.*; // Libreria para el socket
 
class Principal extends JFrame implements ActionListener{
     
    protected PrintWriter envia; //
    protected BufferedReader recibe;
    protected Socket flujo;
    protected JTextArea Texto = new JTextArea(" Bienvenido al juego de Piedra, Papel y Tijeras",40,40); // area para escribir en pantalla
    protected JScrollPane barra; // barra para visualizar el texto que no cabe en el JtextArea
    protected String name; 
    protected int jugador = 0, eleccion1 = 0, eleccion2 = 0; // Jugador Elección 
    protected boolean player1 = true, player2 = true; // para lo funcion logico
     
    protected void abrirFlujo(Socket s) throws Exception { // Consfigura el socket 
    this.flujo = s; // Socket que recibe de los class cliente o servidor
    this.envia = new PrintWriter(this.flujo.getOutputStream(), true); // manda la informacion escribiendo en el socket
    this.recibe = new BufferedReader(new InputStreamReader(this.flujo.getInputStream())); // Lee el buffer del socket y traduce la informacion que le llega 
    }
     
    protected boolean leer() { // funcion que verifica  si se ah enviado elago y si es asi lo reconoce como texto y lo imprime o como una eleccion del jugador y lo manda  a la funcion logico
    try {
        String s = this.recibe.readLine().trim(); // lee lo que que esta en el buffer y segun entinedo el .trim borra los espacios al principio y al final
        if (s != null) {
            System.out.println(" Mensaje recibido "); 
            if( (Integer.parseInt(s) == 1) ||(Integer.parseInt(s) == 2) ||(Integer.parseInt(s) == 3)){ // si es una eleccion del jugador 
            System.out.println(" Lo que llego al servidor Se envia a el operador logico");
            this.logico(Integer.parseInt(s),2);// lo manda a logico
            }
            else{
            this.Texto.append(s + "\n"); // si no es una eleccion se imprime en el JTextArea
            super.repaint();
            }
        } 
    } catch (Exception e) { System.out.println(" Error al recibir un mensaje");}
    return true;
    }
     
    protected void cerrarFlujo() { // cierra los buffers y el socket
    try {
        this.recibe.close();
        this.envia.close();
        this.flujo.close();
    } catch (Exception e) {}
    super.setVisible(false); // si no se logra hace que se desaparesca la ventana
    return;
    }
    // servidor el 1 cliente el 2
    // 1 Piedra, 2 Papel y 3 tijeras
    public void logico(int a, int b){// la funciona logico recibe dos variables
        jugador = b; // una para identificar quien la llama
        if( jugador == 1) // y la otra para identificar el comando del que la llama
        eleccion1 = a; 
        else
        eleccion2 = a;
        System.out.println("Servidor = "+eleccion1+" - Cliente = " + eleccion2);
         
         
        if((eleccion1 != 0) && (player1 == true)){ // funcion que hace saber a los dos jugadores que uno ah hecho su eleccion
        switch(eleccion1){
        case 1: this.Texto.append(" Has picado Piedra - Esperando al oponente ... \n");
        break;
        case 2: this.Texto.append(" Has picado Papel - Esperando al oponente ... \n"); //texto para el servidor
        break;
        case 3: this.Texto.append(" Has picado Tijeras - Esperando al oponente ... \n");
        break;
        }
        this.envia.println(" "+name+" esta esperandote ... ");// texto para el cliente
        super.repaint();
        player1 = false; // en caso de hacer su eleccion no se puede volver a llegar hasta esta parte hasta que el otro tambien haga la suya
        }
         
        if((eleccion2 != 0) && (player2 == true)){
        switch(eleccion2){
        case 1:this.envia.println(" Has picado Piedra - Esperando al oponente ... ");
        break;
        case 2:this.envia.println(" Has picado Papel - Esperando al oponente ... ");
        break;
        case 3:this.envia.println(" Has picado Tijeras - Esperando al oponente ... "); //Texto para el cliente
        break;
        }
        this.Texto.append(" "+name+" esta esperandote ... \n"); // texto para el servidor
        super.repaint();
        player2 = false;
          }
         
        if( (eleccion1 != 0) && (eleccion2 != 0)){
        switch(eleccion1){ // Cuatro switch para poder identificar al ganador y despues imprime una notificacion a los dos jugadores
        case 1: 
                switch(eleccion2){
                case 1: this.Texto.append(" Empate o_o\n\n"); 
                        this.envia.println(" Empate o_o\n");
                        super.repaint();
                break;
                case 2:this.Texto.append(" Lo siento pero has perdido tu oponente escogio Papel :/\n\n"); // servidor 
                       this.envia.println(" Felicidades Ganaste!!! be happy =D \n"); // cliente
                       super.repaint();
                break;
                case 3:this.Texto.append(" Felicidades Ganaste!!!! restregaselo en la cara ;) \n\n");
                       this.envia.println(" Lo siento tu oponente escogio Piedra :/ \n");
                       super.repaint();
                break; 
                }
        break;
        case 2: switch(eleccion2){
                case 1:this.Texto.append(" Felicidades Ganaste!!! be happy =D\n\n");
                       this.envia.println(" Lo siento perdiste tu oponente eligio Papel :/ \n");
                       super.repaint();
                break;
                case 2:this.Texto.append(" Empate o_o\n\n");
                       this.envia.println(" Empate o_o \n\n");
                       super.repaint();
                break;
                case 3:this.Texto.append(" Lo siento perdiste tu oponente eligio Tijeras :/\n\n");
                       this.envia.println(" Felicidades Ganaste!!!  restregaselo en la cara ;)\n");
                       super.repaint();
                    break;
                }
        break;      
        case 3: switch(eleccion2){
                case 1:this.Texto.append(" Lo siento perdiste tu oponente eligio Piedra :/\n\n");
                       this.envia.println(" Felicidades Ganaste!!! be happy =D  \n");
                       super.repaint();
                break;
                 
                case 2:this.Texto.append(" Felicidades Ganaste!!! restregaselo en la cara ;) \n\n");
                       this.envia.println(" Lo siento perdiste tu oponente eligio Tijeras :/ \n");
                       super.repaint();
                break;
                 
                case 3:this.Texto.append(" Empate o_o\n\n");
                       this.envia.println(" Empate o_o \n");
                       super.repaint();
                       break;
                }
                break;
            }
        eleccion1 = eleccion2 = 0; // eleccion se vuelve cero para poder jugar otra ves
        player1 = player2 = true; // igual se vuelven verdaderas
        return;
        }
         
    }
     
 
    public Principal (String nombre){ // Recibe el nombre del jugador de las clases cliente o servidor
    name = nombre; // lo guarda en una variable para la clase
    super.setLocation(300,200); // locacion del la ventana
    super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Salir del programa en caso de cerrar la ventana
    super.setTitle("Piedra, Papel y Tijera"); // Titulo de la ventana
    this.Texto.setEditable(false); // El texto dentro del JTextArea no puede ser editado por el usuario
    JPanel PBoton = new JPanel(new GridLayout(3,0)); // panel auxiliar que contiene a los botones y un layout para este
    JButton Pi = new JButton("Piedra"); // Los botones
    Pi.setActionCommand("Piedra"); // el comando que mandara a el escuchador
    Pi.addActionListener(this); // Se asigna una funcion que escuche al boton
    JButton Pa = new JButton("Papel");
        Pa.setActionCommand("Papel");
    Pa.addActionListener(this);// se le asigna el escuchador que extiende esta ventana por eso se manda el this
    JButton T = new JButton("Tijeras");
        T.setActionCommand("Tijeras");
    T.addActionListener(this);
    PBoton.add(Pi,1,0);
        PBoton.add(Pa,2,0);
        PBoton.add(T,3,0);
    barra = new JScrollPane(Texto); // Barra la barra debe contener el area de texto 
    super.setLayout( new BorderLayout());
    super.add(this.barra, BorderLayout.CENTER);
    super.add(PBoton, BorderLayout.SOUTH);
    super.setSize(400,400); // dimenciones de la ventana
    super.setVisible(true);  // Hacer visible la ventana
    Texto.append("\n\n "+name+" - Esperando al contrincante...\n");
    }
 
    // 1 piedra, 2 papel, 3 tijera
    public void actionPerformed( ActionEvent e){// YO SOY UNA FUNCION QUE ESCUCHA
    String cmd = e.getActionCommand(); // El action event es como el mensajero y le da el mensaje al String cmd
    if (cmd == "Piedra"){ // dependiento de el comando le envia un numero y el identificador de jugador a logico
    this.logico(1, 1);
    return;
    }
    if (cmd == "Papel"){
    this.logico(2, 1);
    return;
    }
    if (cmd == "Tijeras"){
    this.logico(3, 1);
    return;
    }
    }
     
     
}

Son tres partes todas van dentro de la carpeta PPT.
para compilarlo se compila toda la carpeta de esta manera:




Todos los objetos están dentro de la carpeta "PPT" que en el ejemplo de abajo esta dentro de la carpeta "Max". Para ejecutar el cliente y el servidor, tienes que posicionarte dentro de la carpeta "Max" y ejecutar el paquete "PPT" de la siguiente manera:

Servidor:





Cliente:








Bueno eso es todo saludos.

Referencias

Programa Piedra, Papel y Tijeras de la doctora Elisa: http://elisa.dyndns-web.com/teaching/prog/web/ejemplos/chat.tar.gz.
Programa Chat de la doctora Elisa: http://elisa.dyndns-web.com/teaching/prog/web/ejemplos/chat.tar.gz.

1 comentario: