3

私の実験では、

サーバーにこれがある場合:

ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());

次に、クライアント側はこれを逆の順序で行う必要があります。

ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());

そうしないと、サーバーとクライアントがデッドロックします。

これの理由は何ですか?正式な API 仕様はありますか?

4

1 に答える 1

5

はい。これがどのように起こるかがわかります。ObjectInputStreamコンストラクターの javadoc には次のように書かれています。

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

そのため、クライアントとサーバーの両方が自分の のObjectInputStream前に自分を構築した場合ObjectOutputStream、両方とも相手側がシリアライゼーション ストリーム ヘッダーを送信するのを待ってブロックします。

これは、ソケットまたはバイトストリーム レベルではなく、オブジェクト ストリーム レベルで発生していることに注意してください。ソケットを介して単純なバイトまたは文字または「データ」I/O を実行している場合は、ストリームが構築される順序について心配する必要はありません。

また、読み取りと書き込みを行うためにクライアント側とサーバー側 (両方) に別々のスレッドがある場合、これは問題になりません。すべてが等しい場合、ソケットを介したクライアント/サーバー通信を「全二重」にすることができるため、おそらくより優れたアーキテクチャです。

于 2013-02-01T03:16:25.680 に答える