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
Libérer: 2024-11-30 18:59:12
original
548 Les gens l'ont consulté

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()
Copier après la connexion

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))
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal