>백엔드 개발 >파이썬 튜토리얼 >내 Python 소켓이 데이터를 전송하지 않고 수신하지 못하는 이유는 무엇입니까?

내 Python 소켓이 데이터를 전송하지 않고 수신하지 못하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-30 18:59:12500검색

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

Python 소켓이 전송 없이 수신되지 않음

이 질문은 Python 문서의 수정된 소켓 예제가 데이터 수신에 실패하는 문제에 대해 자세히 설명합니다. 초기 전송이 비활성화되었습니다. 문제는 데이터를 연속 스트림으로 처리하는 TCP 소켓의 고유한 특성으로 인해 발생합니다.

원래 예에서 while 루프는 서버가 수신한 모든 메시지를 반향하도록 보장했습니다. 이로써 전송이 응답을 유발하는 간단한 프로토콜이 확립되었습니다.

그러나 수정된 ​​버전에서는 에코 기능을 제거하면 프로토콜이 중단됩니다. 서버는 클라이언트가 연결을 닫을 때까지 기다리는 무한한 데이터 소비자가 됩니다. 보내기가 비활성화되었기 때문에 클라이언트의 데이터가 확인되거나 다시 에코되지 않아 응답을 기다리는 동안 응답이 중단됩니다.

해결책은 클라이언트의 동작을 새 프로토콜에 적응시키는 것입니다. 즉각적인 응답을 기대하는 대신 클라이언트는 연결 끝을 정상적으로 닫아야 합니다. 이는 데이터 전송이 완료되었음을 서버에 알리고 서버가 예상한 "ok" 메시지를 보내도록 요청합니다.

신뢰성을 높이기 위해 클라이언트는 여러 개의 수신 호출을 사용하여 가능한 데이터 조각화를 처리할 수 있습니다. 이렇게 수정하면 분할된 메시지도 성공적으로 수신됩니다.

업데이트된 예제 코드:

서버

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

클라이언트

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

이러한 수정 사항을 따르면 예제에서는 클라이언트가 중단되지 않으며 서버의 즉각적인 응답 없이도 서버가 데이터 교환을 원활하게 처리합니다.

위 내용은 내 Python 소켓이 데이터를 전송하지 않고 수신하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.