自己写了一个小的服务器代码,从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循环的方法,会被阻塞。
求解啊!!
以下は Java API ドキュメントの read メソッドの説明です:
新しいデータを読み取ることができない場合、読み取りがブロックされることを意味します。
while read に配置すると、クライアントがデータを送信する場合、read はブロックされず、クライアントが 2 回目にデータを送信しなくなるまでループが継続されます。サーバーがデータを読み取れない場合、サーバーはクライアントのデータを待ち続けることになり、クライアントはブロックされます。
すべてがブロックされますが、一度読んだだけでは感じられません。
while
の使用は処理方法によって異なります。一般的に、while
は、监听连接
の効果である読み放題に使用されます。監視と読み取りでは、いくつかの送信プロトコルが作成され、単一メッセージのエンドポイントがその送信プロトコルを通じて決定され、エンドポイントが読み取られると、処理のためにハンドラーに送信されます。read
を使用して読み取る場合、コンテンツは自動的に単一のメッセージに分割されず、すべてのコンテンツが連続して読み取られるため、相手がメッセージを送信しない限り、ここでブロックされたままになります。そもそもブロックされているので、ブロックした後、直接スレッドを作成し、読み込んだデータをスレッドに入れることをお勧めします。スレッドに処理させることで、複数のリクエストをリクエストできます。
キーは次のとおりです: while((len = in.read(buffer)) != -1)、ソケットが閉じられていない限り、この while は終了せず、上記のコードは単にコンテンツをしたがって、読み取りができずソケットが閉じられていない場合はブロックされるため、2 つのプログラムはブロックとは関係ありません。