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

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

学习是最好的投资!

répondre à tous(4)
Ty80

Ce qui suit est l'explication de la méthode de lecture dans la documentation de l'API Java :

Cette méthode se bloque jusqu'à ce que les données d'entrée soient disponibles, que la fin du fichier soit détectée ou qu'une exception soit levée.

Cela signifie que la lecture se bloquera lorsqu'aucune nouvelle donnée ne pourra être lue.

Lorsqu'il est placé pendant la lecture, si le client envoie des données, alors read ne bloquera pas et lira les données envoyées par le client dans le tableau. La boucle continuera jusqu'à la deuxième fois où le client n'enverra pas de données au tableau. serveur à nouveau. Ensuite, si le serveur ne peut pas lire les données, il continuera d'attendre les données du client, ce qui le bloquera.

Ty80

Tout sera bloqué, mais vous ne le ressentirez pas si vous ne le lisez qu'une seule fois. L'utilisation de while dépend de la méthode de traitement. Généralement, while est utilisé pour une lecture illimitée, ce qui est l'effet de 监听连接. Lors de la surveillance et de la lecture, certains protocoles de transmission seront élaborés et le point final d'un seul message sera déterminé via le protocole de transmission. Lorsque le point final est lu, il sera soumis au gestionnaire pour traitement. Lorsque vous utilisez read pour lire, le contenu ne sera pas automatiquement divisé en messages uniques, mais tout le contenu sera lu en continu, donc tant que l'autre extrémité n'envoie pas de message, il restera bloqué ici.

迷茫

Il est bloqué en premier lieu. Il est recommandé de mettre le serveur dans un multi-thread. Après le blocage, créez directement un thread et mettez les données lues dans le thread. Laissez le fil le gérer afin que vous puissiez demander plusieurs demandes.

Peter_Zhu

La clé est : while((len = in.read(buffer)) != -1), tant que le socket n'est pas fermé, ce while ne se terminera pas et votre code ci-dessus lit simplement le contenu dans le buffer. , donc la méthode read revient après avoir lu la taille du tampon. Vos deux programmes n'ont rien à voir avec le blocage, car si read ne peut pas lire et que le socket n'est pas fermé, il se bloquera.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal