Java - Tres en raya con UDP

 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

Tres en raya con UDP

Publicado por Víctor (18 intervenciones) el 27/11/2021 19:20:40
Hola buenas estoy atascado con este programa para hacer un tres en raya con Sockets UDP. El problema es que no se como buscar la solución a mi problema en internet por más que busco y mi profesora no me enseño como hacerlo con un jPanel y solo únicamente se hacerlo con jTextField y variantes que a la hora de usar el método run use un append(). MI problema por tanto está en el método run() de las clases que usen jFrame con la interfaz, comparto el código.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package tresEnRaya;
 
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.*;
 
/**
 *
 * @author vdiaz
 */
public class EnviaUDPObjetos {
 
    public static void Envia(Object objeto, String hostdestino, int puerto) {
        try {
            DatagramSocket socket;
            DatagramPacket paquete;
            //El protocolo IP subyacente permite longitudes de paquetes de más de  2^16 bytes,
            //que incluye tanto las cabeceras como los mensajes
            byte bytesEnviar[];
 
            bytesEnviar = serializar(objeto);
 
            socket = new DatagramSocket();
            paquete = new DatagramPacket(bytesEnviar, bytesEnviar.length, InetAddress.getByName(hostdestino), puerto);
            socket.send(paquete);
            socket.close();
 
        } catch (SocketException ex) {
            System.out.println("Error al asignar el socket");
        } catch (UnknownHostException ex) {
            System.out.println("Error al crear el paquete");
        } catch (IOException ex) {
            System.out.println("Error en el envío del paquete");
        }
 
    }
 
    //Serialización
    static byte[] serializar(Object objeto) {      //Flujo de salida en el que escribirá os
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        try {
            //La clase ObjectOutputStream permite convertir un objeto en una secuencia de bytes
            //Construimos indicando el buffer de salida
            ObjectOutputStream os = new ObjectOutputStream(bytes);
            os.writeObject(objeto);
            os.close();
            byte[] bytesEnviar = bytes.toByteArray();
            return bytesEnviar;
        } catch (IOException ex) {
            System.out.println("Error al crear el array de bytes");
        }
        return null;
 
    }
 
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package tresEnRaya;
 
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 *
 * @author vdiaz
 */
public class RecibeUDPObjetos {
 
    public static Object recibe(int puerto) {
        DatagramSocket socket;
        DatagramPacket paquete = null;
        byte recibidos[] = new byte[50000];
        String IPRemota = "";
        int puertoRemoto;
 
        try {
            socket = new DatagramSocket(puerto);
 
            paquete = new DatagramPacket(recibidos, recibidos.length);
 
            socket.receive(paquete);
 
            //Información que podemos obtener de la cabecera del paquete
            IPRemota = paquete.getAddress().getHostName();
            puertoRemoto = paquete.getPort();
 
            socket.close();
        } catch (SocketException ex) {
            System.out.println("Error al asignar el socket");
        } catch (IOException ex) {
            System.out.println("Error en la recepción del paquete");
        }
 
        return deserializar(paquete);
    }
 
    static Object deserializar(DatagramPacket paquete) {
        ByteArrayInputStream bytesDelPaquete = new ByteArrayInputStream(paquete.getData()); // bytes es el byte[]
        try {
            //La clase ObjectInputStream recupera objetos en su forma original
            ObjectInputStream is = new ObjectInputStream(bytesDelPaquete);
            Object objetoAuxiliar = null;
 
            objetoAuxiliar = is.readObject();
 
            is.close();
            return objetoAuxiliar;
        } catch (ClassNotFoundException ex) {
            System.out.println("Error al convertir el objeto");
        } catch (IOException ex) {
            Logger.getLogger(RecibeUDPObjetos.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Error al extraer datos del paquete");
        }
        return null;
    }
 
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package tresEnRaya;
 
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JButton;
 
/**
 *
 * @author vdiaz
 */
public class Jugador1 extends javax.swing.JFrame implements Runnable {
 
    int puertoEnvia = 4500;
    int puertoRecibe = 5500;
 
    /**
     * Constructor
     */
    public Jugador1() {
        initComponents();
        anadirBotonesJPanels();
 
    }
 
    private void anadirBotonesJPanels() {
        jPanel1.setLayout(new GridLayout(3, 3));
 
        for (int i = 0; i < 9; i++) {
            JButton boton = new JButton("");
            boton.setName(String.valueOf(i));
            boton.addMouseListener(new java.awt.event.MouseAdapter() {
                public void mouseClicked(java.awt.event.MouseEvent evt) {
                    boton.setText("X");
                    boton.setBackground(Color.blue);
                    tratoBoton(evt);
                }
            });
 
            jPanel1.add(boton);
        }
    }
 
    private void tratoBoton(java.awt.event.MouseEvent evt) {
        String nombreBoton = ((JButton) (evt.getSource())).getName();
        System.out.println(nombreBoton);
    }
 
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
 
        jPanel10 = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
 
        javax.swing.GroupLayout jPanel10Layout = new javax.swing.GroupLayout(jPanel10);
        jPanel10.setLayout(jPanel10Layout);
        jPanel10Layout.setHorizontalGroup(
            jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );
        jPanel10Layout.setVerticalGroup(
            jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );
 
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
 
        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 297, Short.MAX_VALUE)
        );
 
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
 
        pack();
    }// </editor-fold>
 
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Jugador1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Jugador1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Jugador1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Jugador1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
 
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Jugador1().setVisible(true);
            }
        });
    }
 
    // Variables declaration - do not modify
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel10;
    // End of variables declaration
 
    @Override
    public void run() {
        while(true) {
           //esto es el problema
        }
    }
 
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package tresEnRaya;
 
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JButton;
 
/**
 *
 * @author vdiaz
 */
public class Jugador2 extends javax.swing.JFrame implements Runnable {
 
    int puertoEnvia = 5500;
    int puertoRecibe = 4500;
 
    /**
     * Constructor
     */
    public Jugador2() {
        initComponents();
        anadirBotonesJPanels();
    }
 
    private void anadirBotonesJPanels() {
        jPanel1.setLayout(new GridLayout(3, 3));
 
        for (int i = 0; i < 9; i++) {
            JButton boton = new JButton("");
            boton.setName(String.valueOf(i));
            boton.addMouseListener(new java.awt.event.MouseAdapter() {
                public void mouseClicked(java.awt.event.MouseEvent evt) {
                    boton.setText("O");
                    boton.setBackground(Color.RED);
                    tratoBoton(evt);
 
                }
            });
 
            jPanel1.add(boton);
        }
    }
 
    private void tratoBoton(java.awt.event.MouseEvent evt) {
        String nombreBoton = ((JButton) (evt.getSource())).getName();
        System.out.println(nombreBoton);
    }
 
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
 
        jPanel1 = new javax.swing.JPanel();
 
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
 
        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 468, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
 
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
 
        pack();
    }// </editor-fold>
 
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Jugador2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Jugador2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Jugador2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Jugador2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
 
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Jugador2().setVisible(true);
            }
        });
    }
 
    @Override
    public void run() {
        while (true) {
               //Este es el mismo problema
        }
    }
 
    // Variables declaration - do not modify
    private javax.swing.JPanel jPanel1;
    // End of variables declaration
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder