2011-08-11 2 views
5

Ok donc, j'ai une classe de thread appelée 'Client' chaque fois que le serveur accepte une connexion, il crée un nouveau client .... La méthode run écoute les messages du client et i am useing ObjectInputStream ..Java - Écoute d'un socket avec 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); 

le problème est que j'ai pourquoi dois-je créer une nouvelle ObjectInputStream chaque fois qu'il boucle ... et si je ferme le flux d'entrée à la fin de la boucle et boucles de nouveau pour un autre message j'obtiendrai une erreur ... S'il vous plaît quelqu'un une aide

+2

Vous ne devez pas, et vous ne devriez pas. –

+1

Et obtenir une ClassNotFoundException n'est ni une indication que vous n'êtes plus connecté ni une erreur de programmation. Il indique une erreur de * déploiement *. – EJP

+0

Pourriez-vous indiquer les erreurs que vous obtenez et il serait également utile si vous avez également envoyé le code client. – beny23

Répondre

6

Créer seulement l'ObjectInputStream une fois (en dehors de la boucle) pour une connexion de client, puis mettre le Méthode readObject dans la boucle.

est ici une classe de test de travail:

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(); 
       } 
      } 
     } 
    } 

} 

Dans cet exemple, les chaînes sont envoyés creux le ObjectStream. Si vous obtenez le ClassNotFoundException (http://download.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html#readObject()) et utilisez un programme client et serveur indépendant que vous pouvez vérifier si Le client et le serveur ont tous deux la classe de l'objet à envoyer dans leurs chemins de classes.

+0

ohhh je vois ... merci pour ce pote .. je vais l'essayer plus tard .. et vous dire comment ça se passe .... – MurWade

+0

Je l'ai essayé et ça n'a pas fonctionné .... – MurWade

+1

Le sommeil est inutile, et le La boucle de lecture doit capturer 'EOFException' et sortir de la boucle de lecture lorsqu'elle est interceptée. Toutes les autres 'IOExceptions' à l'exception de' SocketTimeoutException' sont également fatales pour la connexion et doivent quitter la boucle de lecture. Le socket doit être fermé après la fermeture de la boucle de lecture pour une raison quelconque. Trop de mauvaises pratiques ici. – EJP