Sockets Java

Hola de nuevo.
Aquí estoy con nuevas dudas.
Te explico lo que quiero hacer y te paso el código.
Clase Top
            - Variable "datos" contendrá lo que me devuelva un servidor.
            - Visualiza un formulario a pantalla completa.
            - Lee nif y clave.
            - Al pulsar iniciarSesion creo una instancia de Cliente(ref a Top).
            - Si "datos" contiene ciertos caracteres creo instancia de Reloj(ref a Top)
             Y oculto Top. Así se quedará hasta que se cierre Reloj y vuelta a empezar.
             Caso contrario (datos contiene otros caracteres) mensaje de error y me quedo como estoy.
Clase Cliente
- Intento conexión con el servidor 172.17.9.251
- Si es exitoso envío una cadena.
- Creo una instancia de Espera(ref a Top)
- Destruyo Cliente.
Clase Espera
- Escucho por el puerto 893 lo que me venga.
- ¿Cómo puedo controlar el tiempo de espera (pongamos 10 segundos) y si no hay respuesta
¿Destruir Espera?.
- Leo "datos". Modifico "datos" de Top.
- Destruyo Espera.
Mis dudas
---------
Si creo variables en Top, como "datos"... Cómo puedo modificarlas desde "Cliente" o
"¿Espera"?.
Para depurar el código necesito que lo que me devuelvan "Cliente" o "Espera", se me
Visualice en "Top". ¿Cómo puedo hacerlo?. Por ejemplo, en las etiquetas "centro" e "IP".
Todavía no está hecho todo el código. Por ahora, solo quiero que me funcione la comunicación con
Los sockets.
Al compilar me da errores porque no sé como acceder a las variables de Top desde las otras clases.
******************************************************************************************
El código
---------
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
interface VisibilidadControlable{
public void hazteVisible(boolean visible);
}
public class Top extends JFrame implements VisibilidadControlable{
//public class Top extends JFrame {
// JFrame frame = new JFrame("");
JButton cerrar=new JButton("Cerrar");
JButton iniciarSesion=new JButton("iniciarSesion");
JLabel centro=new JLabel("Esta es la cadena del Centro........",JLabel.RIGHT);
JLabel IP=new JLabel("150.214.553.112");
JTextField dni=new JTextField(20);
JTextField pwd=new JTextField(20);
final Image image = new ImageIcon("banner1.jpg").getImage();
String Equipo="med107";
String datos="";
public Top(){ //Constructor
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
Top cliente=new Top();
show();
}
});
cerrar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
iniciarSesion.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e){
// setVisible(false);
// new Aviso();
new Cliente(getVisibilidadControlable());
IP.setText(datos); <--- INTENTO VER LO QUE ME DEVUELVE EL SERVIDOR
// ........
// new Reloj(getVisibilidadControlable());
// dispose();
}
});
Container contentpane = getContentPane();
//Creo un objeto de tipo JPanel
JPanel panel = new JPanel(){
public void paint(Graphics g)
{
int w = getWidth();
int h = getHeight();
int imageW = image.getWidth(this);
int imageH = image.getHeight(this);
int x = (w - imageW)/2;
int y = (h - imageH)/2;
g.drawImage(image, x, y, this);
super.paint(g);
}
};
panel.setLayout(null);
panel.setOpaque(false);
centro.setForeground(Color.white);
centro.setText(leerFichero("Centro.ini"));
centro.setBounds(515,192,350,20);
panel.add(centro);
IP.setForeground(Color.white);
IP.setText(leerFichero("wdfmgrs.ini"));
IP.setBounds(515,492,350,20);
panel.add(IP);
dni.setBounds(505,515,100,20);
panel.add(dni);
pwd.setBounds(505,562,100,20);
panel.add(pwd);
cerrar.setBounds(400,600,100,20);
panel.add(cerrar);
iniciarSesion.setBounds(600,600,150,20);
panel.add(iniciarSesion);
contentpane.add(panel);
Dimension screenSize =Toolkit.getDefaultToolkit().getScreenSize();
setSize(screenSize.width,screenSize.height);
setUndecorated(true);
getRootPane().setWindowDecorationStyle(JRootPane.NONE);
setResizable(false);
setAlwaysOnTop(true);
setLocation(0,0);
setVisible(true);
}
public String leerFichero(String nombre)
{
String centro="";
String linea="";
try
{
BufferedReader br=new BufferedReader(new FileReader(nombre));
while ((linea=br.readLine())!=null)
{centro=linea;}
}
catch(IOException i)
{
}
return centro;
}
public void hazteVisible(boolean visible){
this.setVisible(visible);
}
public VisibilidadControlable getVisibilidadControlable(){
return this;
}
public String cifrando(String clave)
{
char cad[] = new char[51];
int Orden[] = new int[51];
char Cambia[] = new char[51];
for (int i=1; i<=clave.length(); i++)
cad = clave.charAt(i-1);
for (int i=1; i < 51; i++)
Cambia = (char)27;
Orden[1] = 22;
Orden[2] = 5;
Orden[3] = 13;
Orden[4] = 10;
Orden[5] = 1;
Orden[6] = 48;
Orden[7] = 33;
Orden[8] = 21;
Orden[9] = 4;
Orden[10] = 23;
Orden[11] = 12;
Orden[12] = 42;
Orden[13] = 20;
Orden[14] = 3;
Orden[15] = 30;
Orden[16] = 40;
Orden[17] = 15;
Orden[18] = 9;
Orden[19] = 45;
Orden[20] = 28;
Orden[21] = 14;
Orden[22] = 11;
Orden[23] = 19;
Orden[24] = 29;
Orden[25] = 31;
Orden[26] = 39;
Orden[27] = 32;
Orden[28] = 41;
Orden[29] = 8;
Orden[30] = 37;
Orden[31] = 17;
Orden[32] = 6;
Orden[33] = 38;
Orden[34] = 49;
Orden[35] = 43;
Orden[36] = 7;
Orden[37] = 2;
Orden[38] = 16;
Orden[39] = 50;
Orden[40] = 25;
Orden[41] = 24;
Orden[42] = 35;
Orden[43] = 44;
Orden[44] = 47;
Orden[45] = 27;
Orden[46] = 36;
Orden[47] = 46;
Orden[48] = 26;
Orden[49] = 18;
Orden[50] = 34;
for (int i=1; i <= clave.length(); i++)
Cambia[Orden] = cad;
for (int i=1; i<51; i++)
{
if (Cambia=='a')
...

1 Respuesta

Respuesta
1
Para acceder a las variables de Top desde Cliente, lo que debes hacer es meter más métodos en el interfaz VisibilidadControlable. Me explico: imagina que tienes una variable dentro de Top que se llama datos, y que quieres que sea accesible desde Cliente, tanto para leer como para escribir. Para ello, modificas el interfaz VisibilidadControlable y metes estos dos nuevos métodos:
public String getDatos();
public void modificaDatos(String Datos);
Vale. Ahora, debes implementar estos métodos en la clase Top:
public String getDatos(){
  return this.datos;
}
public void modificaDatos(String datos){
  this.datos = datos;
  RefrescaDatosUI(); // me lo acabo de inventar, pero puede ser un método privado para refrescar los datos por pantalla
}
Ahora que Top tiene estos métodos, los puedes invocar desde Cliente, ya que en el constructor de Cliente se pasa una referencia a un objeto que cumple la interfaz VisibilidadControlable, que tiene los métodos getDatos() y modificaDatos()
Respecto al tema del tiempo de espera para destruir un server socket, no se muy bien para qué quieres hacer eso. Normalmente el método accept() se pone en un bucle infinito para que cuendo los clientes se intenten conectar, siempre esté disponible. Si un cliente se conecta, se abre un hilo nuevo que de servicio al cliente, y el ServerSocket se vuelve a quedar en espera, en el hilo principal.
Bueno, espero haberte aclarado algo. Un saludo y no olvides valorar mi respuesta ;-)
Carlos.
}
Ok.
Voy a probar lo que me dices.
En cuanto al tiempo de espera del socket, es para que si en 10 seg no me ha contestado el servidor, se pueda cerrar la clase y pase otra vez el control a Top, y evitar así que se quede colgado en la clase Espera.
Otra pregunta: Cuando abro un hilo, puedo pasarle también parámetros como cualquier otra clase. Fíjate como lo hago en la clase Tiempo.
Saludos.
Efectivamente, puedes meter un parámetro del tipo Socket en el constructor de Tiempo, meterlo en una variable de la clase (por ejemplo, la llamas miSocket, y si se supera el tiempo hacer un miSocket. Close()

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas