自己写了一个小的服务器代码,从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循环的方法,会被阻塞。
求解啊!!
Ce qui suit est l'explication de la méthode de lecture dans la documentation de l'API Java :
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.
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 utilisezread
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.
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.