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


    } 

} 

a klientnowy ObjectInputStream() blokuje

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


    } 

} 

połączenie zostanie nawiązane pomyślnie, ale w linii kodu serwera

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

kod zatrzymuje i nie dokonuje, co może być problem ??

+1

Zrobiłeś dwa razy więcej kodu SerProga – benjarobin

Odpowiedz

20

Musisz utworzyć ObjectOutputStream przed ObjectInputStream po obu stronach połączenia (!). Po utworzeniu ObjectInputStream próbuje odczytać nagłówek strumienia obiektu od InputStream. Jeśli więc nie został jeszcze utworzony ObjectOutputStream po drugiej stronie, nie ma nagłówka strumienia obiektu do odczytania i będzie on blokował się w nieskończoność.

Albo inaczej sformułowane: jeśli obie strony najpierw skonstruują ObjectInputStream, obie będą blokować próby odczytania nagłówka strumienia obiektu, który nie zostanie zapisany do momentu utworzenia ObjectOutputStream (po drugiej stronie linii); co nigdy nie nastąpi, ponieważ obie strony są zablokowane w konstruktorze ObjectInputStream.

Można to wywnioskować z Javadoc z ObjectInputStream(InputStream in):

serializacji strumień nagłówek jest czytać ze strumienia i zweryfikowane. Ten konstruktor będzie blokował dopóki odpowiedni ObjectOutputStream nie napisze i nie przepuści nagłówka.

ta jest także opisana w punkcie 3.6.2 Podstawowych sieci w Javie przez Esmond Pitta.

+0

Nie rozumiem, dlaczego zamówienie jest istotne między ObjectOutputStream i ObjectInputStream – benjarobin

+1

@benjarobin Jeśli obie strony najpierw skonstruują 'ObjectInputStream', obie zablokują próby odczytu nagłówka strumienia obiektu, które nie zostaną zapisane, dopóki nie zostanie utworzony obiekt 'ObjectOutputStream' (po drugiej stronie linii); co nigdy się nie stanie, ponieważ obie strony są blokowane w konstruktorze obiektu 'ObjectInputStream'. –

+1

Przepraszam, że źle zrozumiałem Twoją wiadomość, przepraszam !!! Komentarz jest bardzo jasny, powinieneś go dodać w swojej odpowiedzi. Nie rozumiem, że zarówno klient, jak i serwer wysyłają w obu kierunkach obiekt (mój zły) Zyskujesz ode mnie +1 :-) – benjarobin

Powiązane problemy