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


    } 

} 

とクライアント新しいObjectInputStreamの()ブロック

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


    } 

} 

は、Connectionは、コードが停止し、進行していない、何があるかもしれない

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

正常に確立けどServerコード沿ったものです問題 ??

+1

SerProgのコードを2倍過ぎました – benjarobin

答えて

20

ObjectInputStreamの接続(!)の前にObjectOutputStreamを作成する必要があります。 ObjectInputStreamが作成されると、InputStreamからオブジェクトストリームヘッダーを読み取ろうとします。したがって、反対側のObjectOutputStreamがまだ作成されていない場合は、読み込むオブジェクトストリームヘッダーがなく、無期限にブロックされます。

または別の言い方をすれば、両方の側が最初にを構成すると、どちらもオブジェクトストリームヘッダーの読み取りをブロックし、ObjectOutputStreamが作成されるまで書き込まれません(行の反対側)。 ObjectInputStreamのコンストラクタで両側がブロックされているために発生しません。

これはObjectInputStream(InputStream in)のJavadocのから推測することができる。

シリアライゼーションストリームヘッダは、ストリームから読み込まれ、検証されます。このコンストラクタは、対応するObjectOutputStreamがヘッダを書き込んでフラッシュするまでブロックします。

これ

もEsmondピットでのJavaに 基本ネットワーキングのセクション3.6.2に記載されています。

+0

ObjectOutputStreamとObjectInputStreamの間に順序が関係する理由がわかりません – benjarobin

+1

@benjarobin両者が最初に 'ObjectInputStream'を作成すると、両方ともオブジェクトストリームヘッダーの読み込みをブロックし、 'ObjectOutputStream'が(行の反対側に)作成されるまでは書き込まれません。 'ObjectInputStream'のコンストラクタで両側がブロックされているので、これは決して起こりません。 –

+1

申し訳ありませんが私はあなたのメッセージを誤解した、ごめんなさい!あなたのコメントは非常にはっきりしているので、答えにそれを加えてください。 私は、クライアントとサーバーの両方が私の答えを更新し、(私の悪い) あなたは問題ありません@benjarobin – benjarobin

関連する問題