2011-10-01 9 views
6

私は本当に馬鹿だと感じています....基本的に私はローカルマシン上のTCPを介して接続しています...そして、クライアントでIn/Outストリームを作成しようとすると、オブジェクト入力ストリーム何がありますか?これは2の印刷後に停止します...例外も何もありません...私が困惑しているこのクラスを部分的に使用したのはこれが初めてではありません。 ObjectInputStreamのspecificationからJava ObjectInputStream hanging

try { 
      System.out.println("1"); 
      mySocket = new Socket("localhost", 11311); 
      System.out.println("12"); 
      oos = new ObjectOutputStream(mySocket.getOutputStream()); 
      System.out.println("2"); 
      ois = new ObjectInputStream(mySocket.getInputStream()); 
      System.out.println("13"); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
+0

サーバーはオブジェクトを送信していますか?サーバーが何も送信しないようです。 – MasterCassim

+0

'ObjectInputStream'はおそらくストリームヘッダが受信されるのを待つでしょう。 – NiematojakTomasz

+0

私は次のことをしていません...サーバーはTCP接続を受け入れます。私はあなたがois.readObject()を読むことを読んだと思った? クライアントが最初のオブジェクトを送信するように設定しました...ストリームを作成したかっただけです。 – Michael

答えて

6

:対応したObjectOutputStream が書き込まれ、ヘッダをフラッシュするまで

このコンストラクタは、ブロックします。

1

(将来の読者の方:)私は、サーバープログラムに愚かな変更を加え、長い間テストしていないため、プログラムがロックされている理由を混同していたため、同じ問題がありました。

ServerSocket

はinapropriate ifため、突然の接続( responderSocket = serverSock.accept();)受け入れ(私が述べた愚かな変更を!)プログラムは、スレッドの外にジャンプし、私はストリームをクローズする finallyブロックを追加し、ソケットなかったので、ソケットが残っていました放棄されずに何かを(ストリームヘッダーであっても)送信または受信しません。だから、クライアント側プログラムに何のストリームヘッダはありませんでした(私は、コードをdebbugged iがロックする前に実行した最後の関数があったことを見た:

public ObjectInputStream(InputStream in) throws IOException { 
    verifySubclass(); 
    bin = new BlockDataInputStream(in); 
    handles = new HandleTable(10); 
    vlist = new ValidationList(); 
    enableOverride = false; 
    readStreamHeader();     //// <== This function 
    bin.setBlockDataMode(true); 
} 

readStreamHeader();

ので、サーバ側で何が起こるかについて注意しますおそらく問題はあなたがそれを期待している場所ではありません!

+3

最初にaccept()ループでオブジェクトストリームを構築するべきではありません。接続処理スレッドのrun()メソッドでそれらを構築する必要があります。それ以外の場合は、ストリームヘッダーのI/Oでaccept()ループをブロックする危険性があります。これにより、後続のクライアントがブロックされます。 – EJP