Max Hernandez

Laberinto - Ejemplo de Canvas en HTML5

miércoles, 22 de septiembre de 2010

Proyecto Medio Curso - Presentación





Muy buen día.
Mi proyecto de medio curso trata sobre una página que ofrece el servicio de una agenda donde el usuario guardara información de personas allegadas a el confiando en que yo el creador de esta no haré mal uso de su información.

Bueno mi proyecto se divide en tres script python :
  • reg.py
  • loggin.py


  • inicio.py


El script reg.py
Este lo que hace es registrar al usuario utilizando para esto un formulario CGI que obtendrá principalmente el nombre de usuario y la contraseña de este.
Este script entra a la base de datos y revisa que los campos sean correctos.




En caso de estar correctos los datos los registra en la base de datos y te devuelve a la página principal.




El script loggin.py
Cuando el usuario por fin quiere ingresar a la página va a necesitar introducir su nombre de usuario y contraseña. Después el script revisa en la base de datos que los datos sean validos y crea un cookie en la pc del usuario con un numero generado aleatoriamente el programa entre el rango de uno billón a dos billones, que también se guarda en la base de datos para poder identificar el usuario mientras que exista ese cookie, después te redirecciona a el script "inicio.py".




El script inicio.py
Este puede parecer el script mas complicado de los tres pero es el que menos trabajo me costo. lo que hace este script es imprimir diferentes html la variable op es la que hace referencia a una de las cuatro paginas que se ven ahí que son "inicio" que solamente te muestra un pequeño texto que te da la bienvenida al servicio. la opción lista de contactos que es relativamente la parte mas importante de la pagina, esta muestra un formulario cgi que tiene parámetros para guardar información de contactos como por ejemplo: teléfono, correo, dirección, etc.




Los contactos ingresados los imprime en la parte de abajo de la pagina de contactos con un link que le manda al script de eliminar el contacto(este link no funciona correctamente aun, pues elimina todos los contactos del usuario ). Por ultimo la opción de salir la cual hace que el script entre a la base de datos y elimine la variable de sesión del usuario.



Cabe destacar que el script inicio no te deja visualizar más que una pantalla que te muestra un texto que dice "identifiquese para poder acceder al servicio" y luego te redirecciona ala pagina principal si es que no tienes un cookie valido.



Tengo problemas para configurar el micrófono así que mi vídeo no tiene sonido pero tratare de repararlo hoy, disculpas por las molestias.



Link a album de imágenes.

Aquí esta el link al próyecto.

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.