自己写了一个小的服务器代码,从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循环的方法,会被阻塞。
求解啊!!
Berikut ialah penjelasan dokumentasi API Java tentang kaedah baca:
Ini bermakna bacaan akan disekat apabila tiada data baharu boleh dibaca.
Apabila diletakkan semasa membaca, jika klien menghantar data, maka baca tidak akan menyekat dan akan membaca data yang dihantar oleh klien ke dalam tatasusunan Gelung akan berterusan sehingga kali kedua apabila klien tidak menghantar data ke pelayan sekali lagi. Kemudian Jika pelayan tidak dapat membaca data, ia akan terus menunggu data pelanggan, yang akan menyekatnya.
Semuanya akan disekat, tetapi anda tidak akan merasakannya jika anda membacanya sekali sahaja. Penggunaan
while
bergantung kepada kaedah pemprosesan Secara amnya,while
digunakan untuk bacaan tanpa had, iaitu kesan daripada监听连接
. Dalam pemantauan dan pembacaan, beberapa protokol penghantaran akan disediakan, dan titik akhir satu mesej akan ditentukan melalui protokol penghantaran Apabila titik akhir dibaca, ia akan diserahkan kepada pengendali untuk diproses. Apabila menggunakanread
untuk membaca, kandungan tidak akan dibahagikan secara automatik kepada satu mesej, tetapi semua kandungan akan dibaca secara berterusan, jadi selagi hujung yang satu lagi tidak menghantar mesej, ia akan kekal disekat di sini.Ia disekat di tempat pertama. Adalah disyorkan untuk meletakkan pelayan ke dalam rangkaian berbilang Selepas menyekat, terus buat utas dan masukkan data baca ke dalam utas. Biarkan benang mengendalikannya, supaya anda boleh meminta berbilang permintaan.
Kuncinya ialah: while((len = in.read(buffer)) != -1), selagi soket tidak ditutup, while ini tidak akan keluar dan kod anda di atas hanya membaca kandungan ke dalam buffer. , jadi kaedah baca kembali selepas membaca saiz penimbal anda tidak ada kaitan dengan penyekatan, kerana jika bacaan tidak dapat dibaca dan soket tidak ditutup, ia akan menyekat.