2013-01-01 9 views
5
public class SerProg { 


    static ServerSocket ser=null; 
    static Socket cli=null; 
    static ObjectInputStream ins=null; 
    static ObjectOutputStream outs=null; 


    public static void main(String[] args) { 

     try { 

      ser=new ServerSocket(9000,10); 
      cli=ser.accept(); 

      System.out.println("Connected to :"+cli.getInetAddress().getHostAddress()+" At Port :"+cli.getLocalPort()); 

      ins=new ObjectInputStream(cli.getInputStream()); 
      outs=new ObjectOutputStream(cli.getOutputStream()); 

      String str=(String)ins.readObject(); 


     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 

} 

e il clientenuova ObjectInputStream() blocchi

public class SerProg { 

    /** 
    * @param args 
    */ 
    static ServerSocket ser=null; 
    static Socket cli=null; 
    static ObjectInputStream ins=null; 
    static ObjectOutputStream outs=null; 


    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     try { 

      ser=new ServerSocket(9000,10); 
      cli=ser.accept(); 

      System.out.println("Connected to :"+cli.getInetAddress().getHostAddress()+" At Port :"+cli.getLocalPort()); 

      ins=new ObjectInputStream(cli.getInputStream()); 
      outs=new ObjectOutputStream(cli.getOutputStream()); 

      String str=(String)ins.readObject(); 


     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 

} 

la connessione viene stabilita con successo, ma in linea di codice del server

ins=new ObjectInputStream(cli.getInputStream()); 

il codice si ferma e non procede, quello che potrebbe essere il problema ??

+1

Hai fatto passato due volte il codice di SerProg – benjarobin

risposta

20

È necessario creare lo ObjectOutputStream prima dello ObjectInputStream su entrambi i lati della connessione (!). Quando viene creato il ObjectInputStream, tenta di leggere l'intestazione del flusso dell'oggetto da InputStream. Quindi se il ObjectOutputStream sull'altro lato non è stato ancora creato non c'è un'intestazione del flusso di oggetti da leggere e si bloccherà all'infinito.

Oppure formulata in modo diverso: Se entrambe le parti prima costruire il ObjectInputStream, entrambi bloccare cercando di leggere l'intestazione oggetto flusso, che non sarà scritto fino alla ObjectOutputStream è stato creato (sull'altro lato della linea); che non accadrà mai perché entrambe le parti sono bloccate nel costruttore di ObjectInputStream.

Questo può essere dedotto da Javadoc di ObjectInputStream(InputStream in):

Un serializzazione intestazione del flusso viene letto dal flusso e verificato. Questo costruttore bloccherà finché il corrispondente ObjectOutputStream non avrà scritto e svuotato l'intestazione.

Questo è anche descritta nella sezione 3.6.2 della networking Fondamentale in Java da Esmond Pitt.

+0

non capisco il motivo per cui l'ordine è rilevante tra ObjectOutputStream e ObjectInputStream – benjarobin

+1

@benjarobin Se entrambe le parti prima costruire la 'ObjectInputStream', entrambi saranno bloccare il tentativo di leggere l'intestazione oggetto stream, che non sarà scritto fino a quando non sarà stato creato 'ObjectOutputStream' (dall'altra parte della linea); che non accadrà mai perché entrambe le parti sono bloccate nel costruttore di 'ObjectInputStream'. –

+1

Mi spiace di aver frainteso il tuo messaggio, scusa !!! Il tuo commento è molto chiaro, dovresti aggiungerlo nella tua risposta. Non ho capito che sia il client che il server inviano entrambi gli oggetti direzione (mio male) Ottieni +1 da me :-) – benjarobin