2011-02-06 24 views
0

以下のコードに問題があります。イン/アウトの変数をどのように初期化できるかは不明です。ストリームの入出力のためのjava初期化変数

このオブジェクトの作成時に、コンストラクタ内でプログラムがハングします。それはthis.inObjects = new ObjectIn.........の行にハングアップします。それらのメソッドを呼び出すだけで入出力の文字列やオブジェクトを読み書きするために、一度だけそれらの入出力オブジェクトを作成したいと思います。

どこが間違っていますか?データを受信しないことでハングアップする可能性はありますか?彼らはそうしてはいけませんね。そうでなければ、それは常にブロック

this.outObjects = new ObjectOutputStream(this.clientSocket.getOutputStream()); 
this.inObjects = new ObjectInputStream(this.clientSocket.getInputStream()); 

いくつかのヘッダのOISを待つのコンストラクタは、最初に送信しなければならない:

public class PokerClient 
{ 
    private PokerClientGui gui; 
    private Socket clientSocket; 
    private DataInputStream in; 
    private DataOutputStream output; 
    private ObjectInputStream inObjects; 
    private ObjectOutputStream outObjects; 
    private Hand hand; 

    //constructor 
    public PokerClient() 
    { 
     try 
     { 
      this.gui= gui; 
      this.clientSocket = new Socket("localhost", 4444); 
      this.in = new DataInputStream(this.clientSocket.getInputStream()); 
      this.inObjects = new ObjectInputStream(this.clientSocket.getInputStream()); 
      this.output = new DataOutputStream(this.clientSocket.getOutputStream()); 
      this.outObjects = new ObjectOutputStream(this.clientSocket.getOutputStream()); 
     } 
     catch (Exception e) 
     { 
     } 
} 

答えて

2

オブジェクト出力ストリームを最初に作成してフラッシュする必要があります。同じストリームを2つの異なる方法でラップするべきではありません。エラーが発生して何が間違っているのか判断できない場合を除き、例外をキャッチして無視しないでください。自分自身にフィールドを割り当てないでください。これは何も役立たず、人々を混乱させます。

public class PokerClient { 
    private final PokerClientGui gui; 
    private final Socket clientSocket; 
    private final ObjectOutputStream outObjects; 
    private final ObjectInputStream inObjects; 

    public PokerClient(PokerClientGui gui) throws IOException { 
    this.gui = gui; 
    clientSocket = new Socket("localhost", 4444); 
    outObjects = new ObjectOutputStream(clientSocket.getOutputStream()); 
    outObjects.flush(); 
    inObjects = new ObjectInputStream(clientSocket.getInputStream()); 
    } 
} 
+0

thx! (現場の自動割り当てには申し訳ありません)私はこれをtomorrrowしよう! – Mikeel

1

スワップの2行は、すなわち、この順序を使用します。

+0

私が交換しようとしたが、それは再びハング...私はそれが動作するすべての行をコメントする代わりにあれば...とさえ私は最初の1を残した場合: this.in =新しいDataInputStreamの(this.clientSocketを.getInputStream());それはOKです...私はプログラムのこの部分を何も送ったり受け取ったりしないので、それはありますか? – Mikeel

+0

DataInputStreamに問題はありません。入力が必要なのでObjectInputStreamブロックのみです。デバッガや何らかの印刷を使用して、どこがハングするかを調べます。私は自分が問題に遭遇し、Javadocのどこかでそれを見つけることができるので、私が書いたことについて確信しています。 – maaartinus

+0

データストリームをドロップすると、プレーンデータにもオブジェクトストリームを使用できます。 'interface ObjectInput extends DataInput'です。しかし、私はあなたの例でそれがどのように問題を引き起こすかは分かりません。 – maaartinus