Maison >développement back-end >Tutoriel Python >Pourquoi mon socket Python ne reçoit-il pas de données sans les envoyer ?

Pourquoi mon socket Python ne reçoit-il pas de données sans les envoyer ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-30 18:59:12500parcourir

Why Doesn't My Python Socket Receive Data Without Sending?

Le socket Python ne reçoit pas sans envoi

Cette question se penche sur un problème dans lequel un exemple de socket modifié de la documentation de Python ne parvient pas à recevoir des données après le l'envoi initial a été désactivé. Le problème survient en raison de la nature inhérente des sockets TCP, qui traitent les données comme un flux continu.

Dans l'exemple d'origine, la boucle while garantissait que le serveur renvoyait chaque message qu'il recevait. Cela a établi un protocole simple où l'envoi déclenchait la réponse.

Cependant, dans la version modifiée, la suppression de la fonctionnalité d'écho perturbe le protocole. Le serveur devient un consommateur infini de données, attendant que le client ferme la connexion. L'envoi étant désactivé, les données du client ne sont ni reconnues ni renvoyées, ce qui provoque leur blocage en attendant une réponse.

La solution réside dans l'adaptation du comportement du client au nouveau protocole. Au lieu d'attendre une réponse immédiate, le client doit fermer gracieusement sa fin de connexion. Cela signale au serveur qu'il a terminé l'envoi des données, l'invitant à envoyer le message « ok » attendu.

Pour améliorer la fiabilité, le client peut utiliser plusieurs appels recv pour gérer une éventuelle fragmentation des données. Cette modification garantit que même les messages segmentés sont reçus avec succès.

Exemples de codes mis à jour :

Serveur

import socket

HOST = ''
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(1)

conn, addr = s.accept()
print('Connected by', addr)

while True:
    data = conn.recv(1024)
    if not data: break
conn.sendall(b'ok')
conn.shutdown(socket.SHUT_WR)
conn.close()

Client

import socket

HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
s.shutdown(socket.SHUT_WR)
data = b''
while True:
    buf = s.recv(1024)
    if not buf:
        break
    data += buf
s.close()
print('Received', repr(data))

En suivant ces modifications, l'exemple s'assure que le client ne se bloque pas, et que le serveur gère gracieusement l'échange de données, même sans réponse immédiate du serveur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn