0

Buen dia a todos y todas, les pido ayuda porque recién estoy comenzando a programar en este maravilloso lenguaje. Estoy viendo el tema de sockets. La aplicación que estoy desarrollando es un ejercicio de un curso. Consta de dos aplicaciones, un servidor y un cliente. La idea es enviar texto del cliente al servidor y poder visualizarla en un JTextArea. La estructura del servidor, que es la mas ordenada desde mi humilde punto de vista. O sea separando en tres clases, una para el marco, otra para el panel y finalmente la principal (con su método main), a continuación les presento el código:

 /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package sockets;

import java.awt.BorderLayout;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

/**
 *
 * @author ElioGabriel
 */
public class Servidor {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        MarcoServidor srvAplicacion = new MarcoServidor();
        srvAplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

class MarcoServidor extends JFrame implements Runnable{

    //private static final long serialVersionUID = -4936437215667429578L;

    public MarcoServidor() {
        setSize(280, 350);
        setLocation(1200, 300);
        setTitle("Aplicación servidor");
        PanelServidor placaPrincipal = new PanelServidor(pizarra);
        add(placaPrincipal);
        setVisible(true);
        Thread hiloEscucha = new Thread(this);
        hiloEscucha.start();
    }

    @Override
    public void run() {
        try {
            //System.out.println("Estoy a la escucha");
            ServerSocket servidor = new ServerSocket(666);
            Socket miConeccion = servidor.accept();
            DataInputStream flujoEntrada = new DataInputStream(miConeccion.getInputStream());
            String mensaje = flujoEntrada.readUTF();
            pizarra.append("\n" + mensaje);
            miConeccion.close();
        } catch (IOException ex) {
            Logger.getLogger(MarcoServidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private JTextArea pizarra;
}

class PanelServidor extends JPanel {

    //private static final long serialVersionUID = -5656876162391517099L;

    public PanelServidor(JTextArea campo) {
        setLayout(new BorderLayout());
        campo = new JTextArea();
        add(campo, BorderLayout.CENTER);
    }

}

En la linea 58 me indique que el objeto JTextArea se he inicializado en valor null, pero no entiendo porque, ya fue inicializado en el constructor del panel, Esta consulta es muy importante para mi porque todavía no me queda claro donde declarar algunos objetos, a veces en el constructor de un objeto, a veces el el cuerpo del otro. Me gustaría poder resolver este tema. Desde ya gracias a todos por su ayuda. Saludos cordiales.

gabrieldrv
  • 21
  • 8

1 Answers1

0

Esta línea:

PanelServidor placaPrincipal = new PanelServidor(pizarra);

Pasa el valor de la referencia de tu JTextField al constructor de PanelServidor, cualquier modificación hecha no será vista por el método que realiza la llamada anterior. El valor de pizarra seguirá siendo null al finalizar la ejecución.

Intenta refactorizar tu código para que lo anterior no ocurra.

[Edición] Te dejo una explicación más completa de lo descrito anteriormente:

james_bond
  • 927
  • 5
  • 8
  • Muchas gracias james_bond. He podido solucionar el problema. Pero aun mejor he podido identificar mi falencia. Debo profundizar mas sobre el paso de parametros con objetos. Si bien, todavía no me queda muy claro se por donde tengo que empezar a buscar. Saludos cordiales a todos. – gabrieldrv Feb 13 '18 at 13:10
  • Si pensas que mi respuesta te ha sido de utilidad considera votar y/o aceptar la misma de acuerdo a la guia del sitio: https://es.stackoverflow.com/help/someone-answers – james_bond Feb 13 '18 at 14:20