Filtro CPL Polarizado ventajas

Sockets en Java (Cliente y Servidor) - Juego del Gato - Java Networking

Sockets en Java (Cliente y Servidor)
Ejemplo de Sockets con Java
Sockets Java
Java Sockets juego del gato
Java Networing


Les comparto un juego realizado en JAVA que utiliza Sockets para comunicarse entre si. Uno de ellos es el cliente y el otro el servidor. El juego aun no esta en su totalidad terminado pero ofrece lo esencial para mantener una comunicación entre el cliente y el servidor. 

Hay que recordar que para que exista la comunicación, uno tiene que escuchar y otro que enviar la información, por tanto, ese es un factor clave a la hora de programar una aplicación con Sockets.



En la parte de la acción de los botones se manejan 9 de las posiciones y uno para iniciar el server, cuando se selecciona iniciar el server, se inicia el hilo. De lo contrario se setea el valor actual de la posición de la casilla seleccionada, indicando que el server enviara un valor al cliente. Dicho valor se vera reflejado en el while para que se cumpla la condición y el server envie dicha posición al cliente.
public void initServer() {  
       hilo.start();
    }
    
    int con = 0;

    @Override
    public void actionPerformed(ActionEvent e) {
        con++;
        for (int i = 0; i < 9; i++) {
            if (e.getSource() == listaBotones.get(i)) {
                    listaBotones.get(i).setIcon(new ImageIcon(getClass().getResource("/imagenes/Windows" + ".png")));
                    hilo.setM(i);
                    listaBotones.get(i).removeActionListener(this);
            }
        }
        
        if(e.getSource() == accionar){
                initServer();
                System.out.println("Inicio Server");
            }
    }
La parte de escucha del cliente en el servidor lo manejamos en un hilo, esto para que no tengamos problemas a la hora de pintar los graficos o los frames de la ventana de Java. En esta parte obligatoriamente primero el servidor debe iniciar el server, después el cliente debe conectarse y enviar un parámetro indicando si él será el primero o el servidor. Una vez que se tiene ese dato se manda a un método iniciarWhile(int) que controla la comunicación.
public void run() {
        try {
            sc = new ServerSocket(PUERTO);
            so = new Socket();
            System.out.println("Esperando...");
            TableroServer.mensaje.setText("Esperando al otro jugador");
            try {
                InetAddress ip = InetAddress.getLocalHost();
                TableroServer.mensaje2.setText("IP:" + ip.getHostAddress().toString());
            } catch (Exception e) {
            }
            so = sc.accept();
            entrada = new DataInputStream(so.getInputStream());
            salida = new DataOutputStream(so.getOutputStream());
            TableroServer.mensaje.setText("Se conecto el otro jugador");
            mR = entrada.readInt();
            System.out.println("" + mR);
            mM = mA = 10;
            if (mR == 1) {
                TableroServer.mensaje3.setText("Espera!");
                mR = entrada.readInt();
                s = 1;
                System.out.println("" + mR);
                listaBotones.get(mR).setIcon(new ImageIcon(getClass().getResource("/imagenes/linux" + ".png")));
                perder.setG(mR);
                TableroServer.mensaje3.setText("Tu turno!");
                iniciarWhile(s);

            } else {
                s = 1;
                TableroServer.mensaje3.setText("Tu Inicias la partida");
                iniciarWhile(s);
            }

        } catch (Exception e) {
        }
    }
 
Método que controla la comunicación: el valor que recibe este método indica si debe escuchar o debe enviar un valor al cliente conectado. Depende también del estado de las variables mM y mA, dichas variables son enteras, y son los estados de las posiciones que se han elegido en ultima instancia, mM es la posición actual y mA es la posición anterior, si son diferentes entonces significa que el server eligio una nueva casilla y debe enviar un dato al cliente, si dichos valores son iguales significa que debe escuchar o debe esperar a que el cliente envié un valor. Todo esto es dentro de un while para mantener activa la comunicación.

public void iniciarWhile(int ss) throws IOException {
        s = ss;
        while (true) {
            System.out.println("" + mM);
            if (s == 1 && mM != mA) {
                enviar(mM);
                ganar.setG(mM);
                if (ganar.ganaste()) {
                    ganar.resetG();
                    TableroServer.mensaje3.setText("Ganaste!!!");
                    break;
                }
                s = 0;
                mA = mM;
            }
            if (s == 0 && mM == mA) {
                System.out.println("Escuchando...");
                TableroServer.mensaje3.setText("Espera!");
                mR = entrada.readInt();
                listaBotones.get(mR).setIcon(new ImageIcon(getClass().getResource("/imagenes/linux" + ".png")));
                perder.setG(mR);
                if (perder.ganaste()) {
                    perder.resetG();
                    TableroServer.mensaje3.setText("Perdiste!!!");
                    break;
                }
                s = 1;
                mA = mM;
                TableroServer.mensaje3.setText("Tu turno!");
            }
        }
        System.out.println("TERMINO");
        this.stop();
    }
 
De manera general es lo mas importante para dar jugabilidad al programa. En el lado del cliente es muy similar, sólo que en vez de iniciar un hilo con el socket, se inicia un hilo para conectar al servidor.

public void run() {
        try {
            sc = new Socket(HOST, PUERTO);
            salida = new DataOutputStream(sc.getOutputStream());
            entrada = new DataInputStream(sc.getInputStream());
            TableroCliente.mensaje.setText("Te conectaste para jugar");
            iniciarWhile();

        } catch (Exception e) {
        }
    }
 
De la misma manera se manda el control al while para que controle la comunicación. La parte de la comparación del ganador se hace con una clase a parte, en la que en un arreglo de 9 enteros, se setean los valores de las casillas seleccionadas y se comparan cada vez que se selecciona una nueva. Retorna un booleano para indicar si se ha ganado o no.

int []g = new int[9];
    boolean flag = false;
    public Ganador(){
        resetG();
    }
    
    public void setG(int i){
        g[i] = 1;
    }
    
    public final void resetG(){
        flag = false;
        for (int i = 0; i < g.length; i++) {
            g[i] = 0;
        }
    }
    
    public boolean ganaste(){
        if(g[0] == 1 && g[1] == 1 && g[2] == 1){
            flag = true;
        }
        if(g[3] == 1 && g[4] == 1 && g[5] == 1){
            flag = true;
        }
        if(g[6] == 1 && g[7] == 1 && g[8] == 1){
            flag = true;
        }
        if(g[0] == 1 && g[3] == 1 && g[6] == 1){
            flag = true;
        }
        if(g[1] == 1 && g[4] == 1 && g[7] == 1){
            flag = true;
        }
        if(g[2] == 1 && g[5] == 1 && g[8] == 1){
            flag = true;
        }
        if(g[0] == 1 && g[4] == 1 && g[8] == 1){
            flag = true;
        }
        if(g[2] == 1 && g[4] == 1 && g[6] == 1){
            flag = true;
        }
        
        
        return flag;
    }
 
Como sabemos JAVA puede correr en Linux y Windows



Esto sería todo. Cualquier duda dejen su comentario para aclarar.

Link de descarga de los programas cliente y servidor Sockets:
Descargar proyecto completo

http://raboninco.com/GCM4

Comentarios

Publicar un comentario