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

自己写了一个小的服务器代码,从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

学习是最好的投资!

membalas semua(4)
Ty80

Berikut ialah penjelasan dokumentasi API Java tentang kaedah baca:

Kaedah ini menyekat sehingga data input tersedia, penghujung fail dikesan atau pengecualian dilemparkan.

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.

Ty80

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 menggunakan read 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.

Peter_Zhu

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan