2017-04-11 3 views
0

J'ai une application qui est basée sur l'interaction serveur-clients multiples.C'est le thread que j'utilise dans la classe serveur pour créer un nouveau thread où j'accepte tous les nouveaux sockets:Java get ObjectInputStream ObjectOutputStream à partir d'un socket

Thread acceptingThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        Socket s = serverSocket.accept(); 
        listaSocket.add(s); 
        listaOis.add(new ObjectInputStream(s.getInputStream())); 
        listaOos.add(new ObjectOutputStream(s.getOutputStream())); 
        System.out.println("Client connected"); 
       } catch (IOException ex) { 
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 

     } 

    }); 
    acceptingThread.start(); 




private ServerSocket serverSocket; 
private ArrayList<Socket> listaSocket; 
private ArrayList<ObjectInputStream> listaOis; 
private ArrayList<ObjectOutputStream> listaOos; 

les lignes qui bloquent les programmes sont les suivants:

    listaOis.add(new ObjectInputStream(s.getInputStream())); 
        listaOos.add(new ObjectOutputStream(s.getOutputStream())); 
+1

Lire le javadoc du constructeur de ObjectInputStream. –

+1

Je pense que serverSocket.accept() bloque le programme, il attend une nouvelle requête à venir. –

+0

Dans mon client, je crée un socket qui se connecte à ce serveur. Dans s je reçois le socket du client .ObjectInputStream prend un InputStream dans son constructeur. J'obtiens ça de s.getInputStream() – Cristian

Répondre

1

Votre code bloque dans cette ligne particulière:

    listaOis.add(new ObjectInputStream(s.getInputStream())); 

Prenez note du comportement de ce constructeur ObjectInputStream. À partir du Javadoc:

Crée un ObjectInputStream qui lit à partir du InputStream spécifié. Un en-tête de flux de sérialisation est lu dans le flux et vérifié. Ce constructeur bloquera jusqu'à ce que l'ObjectOutputStream correspondant ait écrit et vidé l'en-tête.

Obtenir le InputStream de la connexion entrante signifie que les données sérialisé doit être envoyé par la connexion. Cela signifie que vous devez procéder comme suit avant que le constructeur ne procède:

  1. Connectez-vous du côté client. Je suppose que vous faites déjà cela puisque vous pouvez passer à travers socket.accept()
  2. Ouvrez un OutputStream en utilisant la nouvelle connexion.
  3. Enveloppez le OutputStream avec un ObjectOutputStream.
  4. Envoyez des données via le ObjectOutputStream (c'est-à-dire, écrivez des données sérialisables et affleurez-les).