検索

ホームページ  >  に質問  >  本文

java socket read 阻塞问题???

自己写了一个小的服务器代码,从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循环的方法,会被阻塞。
求解啊!!

PHPzPHPz2889日前414

全員に返信(4)返信します

  • PHP中文网

    PHP中文网2017-04-17 17:49:23

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

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

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

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

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 17:49:23

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

    返事
    0
  • 迷茫

    迷茫2017-04-17 17:49:23

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

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:49:23

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

    返事
    0
  • キャンセル返事