java socket read 阻塞问题???
PHPz
PHPz 2017-04-17 17:47:23
0
4
409

自己写了一个小的服务器代码,从socket中读取数据时,用读一次的方式就不会阻塞,而放在while里面就会阻塞为什么呢?如果read是阻塞的,那么即使是读一次也因该会被阻塞啊?
代码如下:

in.read(buffer);
for(byte b : buffer)
    request.append((char)b);

这是读一次的方法,不会阻塞。

   while((len = in.read(buffer)) != -1){
        for(byte b : buffer){
            request.append((char)b);
    }

这是while循环的方法,会被阻塞。
求解啊!!

PHPz
PHPz

学习是最好的投资!

全員に返信(4)
Ty80

以下は Java API ドキュメントの read メソッドの説明です:

このメソッドは、入力データが利用可能になるか、ファイルの終わりが検出されるか、例外がスローされるまでブロックします。

新しいデータを読み取ることができない場合、読み取りがブロックされることを意味します。

while read に配置すると、クライアントがデータを送信する場合、read はブロックされず、クライアントが 2 回目にデータを送信しなくなるまでループが継続されます。サーバーがデータを読み取れない場合、サーバーはクライアントのデータを待ち続けることになり、クライアントはブロックされます。

いいねを押す +0
Ty80

すべてがブロックされますが、一度読んだだけでは感じられません。 while の使用は処理方法によって異なります。一般的に、while は、监听连接 の効果である読み放題に使用されます。監視と読み取りでは、いくつかの送信プロトコルが作成され、単一メッセージのエンドポイントがその送信プロトコルを通じて決定され、エンドポイントが読み取られると、処理のためにハンドラーに送信されます。 read を使用して読み取る場合、コンテンツは自動的に単一のメッセージに分割されず、すべてのコンテンツが連続して読み取られるため、相手がメッセージを送信しない限り、ここでブロックされたままになります。

いいねを押す +0
迷茫

そもそもブロックされているので、ブロックした後、直接スレッドを作成し、読み込んだデータをスレッドに入れることをお勧めします。スレッドに処理させることで、複数のリクエストをリクエストできます。

いいねを押す +0
Peter_Zhu

キーは次のとおりです: while((len = in.read(buffer)) != -1)、ソケットが閉じられていない限り、この while は終了せず、上記のコードは単にコンテンツをしたがって、読み取りができずソケットが閉じられていない場合はブロックされるため、2 つのプログラムはブロックとは関係ありません。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート