Author Topic: Ayuda conexion servidor/cliente con sockets.!!!  (Read 13213 times)

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5012
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Ayuda conexion servidor/cliente con sockets.!!!
« Reply #15 on: Julio 03, 2010, 10:47:56 am »
No me entero, pensé que te estaba funcionando ya todo. ¿Qué problema tiene ahora ese código?

Se bueno.

the_mind91

  • Newbie
  • *
  • Posts: 40
  • Karma: 0
    • View Profile
Re: Ayuda conexion servidor/cliente con sockets.!!!
« Reply #16 on: Julio 03, 2010, 03:03:30 pm »
El problema que tengo aun el del 1(conexion cliente/server), es el mismo de la conexion del cliente y el server, es decir el server se conecta bien al cliente, el server envia dato al cliente, sí el cliente se desconecta y reintenta conectarse pues, da un error de escritura, me explicaste el problema de esta manera asi:

Quote
Cuando el servidor detecte la caída del cliente (le dará algún error en la lectura o escritura de socket), debe cerrar la conexión, tirar todos los OutputStream e InputStream  y meterse de nuevo en el accept().

Intente seguir tus indicaciones con un codigo que cree con estos fines, que es este.


Code: [Select]
import java.net.*;
import java.io.*;
import java.util.ArrayList;


public class ServerSide {

    private ServerSocket socket;
    private Object objetSend;
    private ObjectOutputStream salidaObje;
    private ArrayList list;
    private Socket cliente;
    private OutputStream stdOuput;
   
    public ServerSide() {

        try {
        socket = new ServerSocket(23400);
socket.setSoTimeout(500);
start();

        }catch(Exception e){e.printStackTrace();}

     }

    public void start() throws IOException{


System.out.println("<<<Esperando cliente>>>");
//obteniendo el cliente.
cliente = socket.accept();
         stdOuput = cliente.getOutputStream();
System.out.println("<<<Cliente Conetado>>>");
         salidaObje = new ObjectOutputStream(stdOuput);
    }

    public void restart(){

        try {
            //cierro la conexion del cliente
            if(cliente != null){
            cliente.close();
            cliente = null;
            //y me deshago de los InputStream/OutputStream incluyendo los de objetos.
            stdOuput.close();
            stdOuput = null;
            salidaObje.close();
            salidaObje = null;
            }
            start();

        }catch(Exception e){ e.printStackTrace(); }

       
    }

    public void sendData(Object sendObj){
        try{
          if(sendObj instanceof ArrayList){
            list = (ArrayList) sendObj;
            if(cliente != null){
            salidaObje.reset();
            salidaObje.writeObject(list);
            }
           
            System.out.println("Objeto enviado.: "+list);
          }
        }catch(Exception e){
            System.out.println("Error--->");
            restart();
            e.printStackTrace();
       
       }
   
  }


}


Pero sigue callendose.!!!!

Adios y muchas gracias por dedicar tu valioso tiempo por la causa.!!!

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5012
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Ayuda conexion servidor/cliente con sockets.!!!
« Reply #17 on: Julio 03, 2010, 04:33:17 pm »
¿Qué es lo que se cae y dónde? ¿Qué error da?

Se bueno.

the_mind91

  • Newbie
  • *
  • Posts: 40
  • Karma: 0
    • View Profile
Re: Ayuda conexion servidor/cliente con sockets.!!!
« Reply #18 on: Julio 03, 2010, 06:31:31 pm »
Lo que se Cae, es el envio de ObjectOutPutStream, ya que cuando intento conectarme con el cliente nuevamente al Server pues este se conecta pero no se puede enviar nada ,ya que el OutputStream genera la siguiente Excepcion, pero en mi codigo sigo las pautas que me indicaste("No se si lo hice mal"), cierro la conexion del cliente, tiro los Output e InputStream si los hay y tambien ObjectOutputStream, y luego me entre en el accept hasta que el cliente acepte dentro del timeout especificado, el cliente acepta pero no se pude escrbir nada.
ya que me genera la siguiente excepcion.

Se cae acá:

Code: [Select]
public void restart(){

        try {
            //cierro la conexion del cliente
            if(cliente != null){
            cliente.close();
            cliente = null;
            //y me deshago de los InputStream/OutputStream incluyendo los de objetos.
            stdOuput.close();
            stdOuput = null;
*/ Aca se cae*/ salidaObje.close();
           salidaObje = null;
            }
*/ Aca se cae*/ start();

        }catch(Exception e){ e.printStackTrace(); }

      
    }

Excepcion:

Quote
java.net.SocketException: Socket closed
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1838)
        at java.io.ObjectOutputStream$BlockDataOutputStream.flush(ObjectOutputStream.java:1783)
        at java.io.ObjectOutputStream.flush(ObjectOutputStream.java:691)
        at java.io.ObjectOutputStream.close(ObjectOutputStream.java:712)
        at openbravo.pos.modif.remote.ServerSide.restart(ServerSide.java:49)
        at openbravo.pos.modif.remote.ServerSide.sendData(ServerSide.java:76)


Lo curioso del caso es que antes de cerrar una conexion cliente, averiguo si este no es nulo, si es asi, procedo a cerrar conexiones,OutputStream, ObjectOutputStream, ya que esta se obtienen atravez del cliente.
y me da el error de socket closed, cuando llamo al metodo Start tambien me da error, ya que este es que se encarga de hacer nuevament el accept, y crear el nuevo ObjectOutputStream para la nueva conexion.


PD: El cliente se conecta al server y el server envia datos correctamente, pero si por alguna razon el cliente se desconecta e intenta conectarse, se conecta pero, el server no puede enviar Datos.


Lo que quiero es que si se interrumpe la conexion del server con el cliente, el cliente pueda volver a conectarse y compartir datos, si puedes creame un pequeño ejemplo, para guiarme, pero que envien fatos constante.

Otra cosa, estaba pensando hacer que si el cliente cae el server tambien, y se reinicie el proceso de conexion de ambos, no se no me parece elegante pero provare a ver si funciona.

Adios y gracias.
« Last Edit: Julio 03, 2010, 08:25:09 pm by the_mind91 »

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5012
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Ayuda conexion servidor/cliente con sockets.!!!
« Reply #19 on: Julio 03, 2010, 09:27:25 pm »
Cerrando el socket (cliente.close()) ya se cierran automáticamente los input y output stream, así que no necesitas cerrarlos nuevamente.

Se bueno.

the_mind91

  • Newbie
  • *
  • Posts: 40
  • Karma: 0
    • View Profile
Re: Ayuda conexion servidor/cliente con sockets.!!!
« Reply #20 on: Julio 04, 2010, 12:09:47 am »
Bueno lo hice como me digiste pero me sigue dando el mismo problema, ahora el error que me esta dando es este, pero he tomado todas, las pautas necesaria para preparar otra conexion, bueno, voy a intentar mejor, que cuando se caiga el cliente se caiga tambien el server, y asi hago la conexion de neuvo, jajaj es poco elegante pero es que este problema me tiene harto, y mi jefe siempre diciendo "Andrei Terminaste de hacerlo bien", xD, oh dios hasta le he cogido miedo.

java.net.SocketException: Connection reset by peer: socket write error
« Last Edit: Julio 04, 2010, 12:12:07 am by the_mind91 »

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5012
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Ayuda conexion servidor/cliente con sockets.!!!
« Reply #21 on: Julio 04, 2010, 05:07:09 am »
Bueno, realmente ya no te da el mismo problema, el problema ahora es otro. "Connection reset by peer" siginifica que el cliente tiene o ha cerrado el socket. ¿Cómo haces la reconexión en el cliente?

Se bueno.

the_mind91

  • Newbie
  • *
  • Posts: 40
  • Karma: 0
    • View Profile
Re: Ayuda conexion servidor/cliente con sockets.!!!
« Reply #22 on: Julio 04, 2010, 03:53:17 pm »
Quote
Bueno lo hice como me digiste pero me sigue dando el mismo problema,
En el sentido de que la reconexion no se hacia con exito.

Quote
ahora el error que me esta dando es este:
, excusame aqui creí que puse esta linea:
Code: [Select]
java.net.SocketException: Connection reset by peer: socket write errorExcusame si no fui muy claro, pero es que tenia mucha prisa.


La reconexion del cliente se hace instanciado un objeto ConnThread y este a su vez crea una instancia de ClientSide en el metodo Run, cuando se pica el boton conectar asi:
Code: [Select]
public void botonConectarActionPerformed(ActionEvent e){
ConnThread hilo = new ConnThread();
//Creé un hilo para que la aplicacion no se quedara frisada, hasta
//que el cliente se conecte ya que dentro del cliente defini un bucle for
//que hace, que intente 20 veces conectarse.

}

En el metodo run de ConnThread:
Code: [Select]
public void run()
   {
       new ClientSide;
     
   }


Aqui esta el codigo, pero precisamente tengo claro que cuando el cliente se caiga (por la razon que sea), el server cerrara el socket del cliente, pero en el server  traté de hacer que cuando el cliente este cerrado pues el server se meta de nuevo en el accept para nuevamente aceptar este cliente y siga su curso normal.

Aqui esta el codigo del cliente. Muchas gracais, ya he resuelto gracias a ti el 90 % del problema de la aplicacion solo falta esta partecitaç xD.

Codigo Cliente.

Code: [Select]

import java.net.*;
import java.io.*;
import java.util.ArrayList;
import javax.swing.*;
import java.awt.*;

public class ClientSide {

Socket socket;
ArrayList list;
Object aux;


ClientSide() {

for(int loop=1; loop <= 20; loop++){
try{
    //antes tenia el while desde aca, se creaba una nueva referencia
   //por cada loop, y se perdia la antigua referencia y por ende la conexion.
       if(socket == null)
  socket = new Socket("localhost",23400);
   System.out.println("<<Conectado al cliente>>");
ObjectInputStream entrada = new
    ObjectInputStream(socket.getInputStream());

      



while(true){
     JDialog  message = new JDialog((JFrame)null,false);
 message.setLayout(new BorderLayout());
 
     JLabel info = new JLabel("");

    aux = entrada.readObject();// Se lee el objeto
    if (aux instanceof ArrayList) // Se comprueba si es de tipo ArrayList
        list = (ArrayList)aux; // Se hace el cast.
 
 for(int i=0; i<list.size();i++){
    System.out.println(list.get(i));
        info.setText(info.getText() + list.get(i)+ (i == list.size()-1 ?"</html>":""));
 System.out.println("<<test---> "+ info.getText() + list.get(i)+"</html>");
        
    }        
       //metemos la etiqueta dentro del ScrollPane y luego metemos ese panel en el JDialog.
      // message.add(scPane.add(info));
message.add(new JScrollPane(info),BorderLayout.CENTER);

    message.setSize(300,300);
             message.setVisible(true);
 System.out.println(list.toString());  
    }
    }catch(Exception e){
System.out.println("Error --->.: "+e.getMessage());}
    

   }
}

public static void main(String args[]){
    new ClientSide();


}

}



Adios y muchas gracias por todo. :) :) :) :)
« Last Edit: Julio 04, 2010, 04:10:59 pm by the_mind91 »

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5012
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Ayuda conexion servidor/cliente con sockets.!!!
« Reply #23 on: Julio 04, 2010, 09:04:40 pm »
Bueno, no veo dónde se desconecta o por qué. Tampoco parece que se esté haciendo un socket=null, por lo que el if (socket==null) sólo entrará dentro la primera vez y no volverá a haber reconexiones.

Se bueno.

the_mind91

  • Newbie
  • *
  • Posts: 40
  • Karma: 0
    • View Profile
Re: Ayuda conexion servidor/cliente con sockets.!!!
« Reply #24 on: Julio 04, 2010, 09:45:25 pm »
Hola Chuidiang.

Quote
Bueno, no veo dónde se desconecta o por qué.
Bueno, ya te explique que se puede desconectar, por ejemplo si una persona cierra la aplicacion, lo que deseo es que este se conecte al server una vez la aplicacion arranca de nuevo, segun mis System.out.prinln(), el se logra conectar pero el server falla cuando intenta enviar los datos a esta nueva conexion.

Un saludo y muchas gracias.!!!


Chuidiang crees que tengas tiempo donde mi ilustres un pequeño ejemplo que se de  esta situacion:  server y  cliente se conectan, server te pide datos por teclado durante un ciclo infinito para mandar la informacion al cliente, el cliente recibe tambien información infinita, Ups, se apago el cliente, el server sigue corriendo, se conecta nuevamente el cliente, la conexion es un exito, y el envio de datos tambien.




Esta es la manera mas sencilla de explicar el problema, ups, Sockets me han puesto a coger un poco de lucha xD, ya me he leido muchas veces tu wiki acerca de socket, tambien de los apendices de la biblia de java, creo que entiendo el tema mas o menos, pero no logro hacer la situacion que te describi.

Adios y muchas gracias por tu tiempo.

 :) :) :) :)
« Last Edit: Julio 04, 2010, 10:06:28 pm by the_mind91 »