0

以下のコードに問題があります。in/outの変数を初期化する方法が明確ではありません。

このオブジェクトの作成中に、コンストラクター内でプログラムがハングします。の行にぶら下がっていますthis.inObjects = new ObjectIn.........。これらの入出力オブジェクトを一度だけ作成して、メソッドで呼び出したり、読み取り/書き込みなどを適用したりするだけで、入出力、文字列、オブジェクトの読み取りと書き込みを行いたいと思います。

どこが間違っているのですか?データを受信しないことでハングする可能性はありますか?彼らはすべきではありませんよね?

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)
        {
        }
}
4

2 に答える 2

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());
  }
}
于 2011-02-06T19:31:59.130 に答える
1

2つの行を入れ替えます。つまり、次の順序を使用します。

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

OISのコンストラクターはヘッダーを待機します。最初に送信する必要があります。そうしないと、常にブロックされます。

于 2011-02-06T17:23:53.797 に答える