Maison >développement back-end >Tutoriel Python >Pourquoi mon socket Python ne reçoit-il pas de données après le premier appel « recv() » à moins que je modifie le client ?

Pourquoi mon socket Python ne reçoit-il pas de données après le premier appel « recv() » à moins que je modifie le client ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-28 20:10:16559parcourir

Why Doesn't My Python Socket Receive Data After the First `recv()` Call Unless I Modify the Client?

Le socket Python ne reçoit pas de données sans les envoyer

Problème :

La méthode socket.recv() de Python ne renvoie pas données lorsqu'il est appelé une deuxième fois après avoir modifié le code du serveur d'écho pour éviter de renvoyer des données au client.

Analyse :

Les sockets TCP fonctionnent comme des flux de données, sans corrélation un à un entre les appels d'envoi et de réception. Le code initial adhérait à un protocole spécifique dans lequel le serveur renvoyait exactement ce qu'il avait reçu jusqu'à ce que le client ferme la connexion.

La modification a modifié les règles, obligeant le serveur à recevoir et à rejeter continuellement des données sans répondre jusqu'à ce que le client fermé leur extrémité. Le client, attendant une réponse immédiate, se bloque indéfiniment.

Solution :

Pour résoudre ce problème, le client doit ajuster son comportement pour correspondre au protocole du serveur modifié.

  • Modification du client :

    Fermer le côté sortant du socket pour signaler l’achèvement, permettant au serveur d’envoyer la réponse. Implémentez plusieurs opérations recv() pour gérer la fragmentation potentielle des données.

  • Code client mis à jour :
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))
  • Code serveur mis à jour :

    Maintenir le protocole modifié, en envoyant "ok" une fois le client ferme leur connexion entrante.

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()

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