2011-08-11 10 views
5

Ok, tengo una clase de subproceso llamado 'Cliente' cada vez que el servidor acepta una conexión, crea un nuevo Cliente .... El método de ejecución escucha mensajes del cliente y yo estoy useing ObjectInputStream ..Java - Escuchando un socket con ObjectInputStream

do {    
     ObjectInputStream in = null; 

     try { 
      in = new ObjectInputStream(socket.getInputStream()); 
      String message = (String) in.readObject(); 
      System.out.println(message); 
      } 
      catch (ClassNotFoundException ex) { 
       isConnected = false; 
       System.out.println("Progoramming Error"); 
      } 
      catch (IOException ex) { 
       isConnected = false; 
       System.out.println("Server ShutDown"); 
       System.exit(0); 
      } 
    } while(isConnected); 

el problema que tengo es que ¿por qué tengo que crear una nueva ObjectInputStream cada vez que se realiza un bucle ... y si cierro el flujo de entrada al final del bucle y se realiza un bucle de nuevo para otro mensaje, obtendré un error ... Por favor, alguna ayuda

+2

No es necesario, y no deberías. –

+1

Y obtener una ClassNotFoundException no es una indicación de que ya no está conectado ni un error de programación. Indica un error * deployment *. – EJP

+0

Podría pasar los errores que está recibiendo y también sería útil si también publicó el código del cliente. – beny23

Respuesta

6

Crea solo el ObjectInputStream una vez (fuera del ciclo) para una conexión de cliente, luego pon el Método readObject en el bucle.

Aquí es una clase de prueba de trabajo:

public class TestPrg { 

    public static void main(String... args) throws IOException { 
     ServerListener server = new ServerListener(); 
     server.start(); 

     Socket socketToServer = new Socket("localhost", 15000); 
     ObjectOutputStream outStream = new ObjectOutputStream(socketToServer.getOutputStream()); 

     for (int i=1; i<10; i++) { 
      try { 
       Thread.sleep((long) (Math.random()*3000)); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("Sending object to server ..."); 
      outStream.writeObject("test message #"+i); 
     } 
     System.exit(0); 

    } 

    static class ServerListener extends Thread { 

     private ServerSocket serverSocket; 

     ServerListener() throws IOException { 
      serverSocket = ServerSocketFactory.getDefault().createServerSocket(15000); 
     } 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        final Socket socketToClient = serverSocket.accept(); 
        ClientHandler clientHandler = new ClientHandler(socketToClient); 
        clientHandler.start(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    static class ClientHandler extends Thread{ 
     private Socket socket; 
     ObjectInputStream inputStream; 

     ClientHandler(Socket socket) throws IOException { 
      this.socket = socket; 
      inputStream = new ObjectInputStream(socket.getInputStream()); 
     } 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        Object o = inputStream.readObject(); 
        System.out.println("Read object: "+o); 
       } catch (IOException e) { 
        e.printStackTrace(); 

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

} 

En este ejemplo cadenas se envían a través del ObjectStream. Si obtiene la ClassNotFoundException (http://download.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html#readObject()) y está utilizando un programa cliente y servidor independiente de lo que podría verificar si tanto el cliente como el servidor tienen la clase del objeto para enviar en sus rutas de clase.

+0

ohhh veo ... gracias por ese amigo ... lo intentaré más tarde ... y te contaré cómo va ... – MurWade

+0

Lo probé y no funcionó ... – MurWade

+1

El sueño no tiene sentido, y el sueño no tiene sentido read loop debería capturar 'EOFException' y salir del bucle de lectura cuando sea capturado. Todas las demás 'IOExceptions' excepto' SocketTimeoutException' también son fatales para la conexión y deben salir del ciclo de lectura. El zócalo debe cerrarse después de que el bucle de lectura finalice por algún motivo. Demasiada mala práctica aquí. – EJP

Cuestiones relacionadas