>백엔드 개발 >파이썬 튜토리얼 >클라이언트를 수정하지 않으면 내 Python 소켓이 첫 번째 `recv()` 호출 후 데이터를 수신하지 못하는 이유는 무엇입니까?

클라이언트를 수정하지 않으면 내 Python 소켓이 첫 번째 `recv()` 호출 후 데이터를 수신하지 못하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-28 20:10:16590검색

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

Python 소켓이 전송하지 않고 데이터를 받지 못합니다

문제:

Python의 소켓.recv() 메서드가 반환되지 않습니다. 데이터가 다시 전송되는 것을 방지하기 위해 에코 서버 코드를 편집한 후 두 번째 호출 시 데이터 client.

분석:

TCP 소켓은 데이터 스트림으로 작동하므로 호출 보내기와 받기 간의 일대일 상관 관계가 부족합니다. 초기 코드는 클라이언트가 연결을 종료할 때까지 서버가 수신한 내용을 정확히 다시 보내는 특정 프로토콜을 준수했습니다.

수정으로 인해 규칙이 변경되어 서버가 클라이언트가 연결을 종료할 때까지 응답 없이 계속 데이터를 수신하고 삭제하게 되었습니다. 끝을 맺었습니다. 즉각적인 응답을 기대하는 클라이언트가 무기한 정지됩니다.

해결책:

이 문제를 해결하려면 클라이언트가 수정된 서버 프로토콜과 일치하도록 동작을 조정해야 합니다.

  • 클라이언트 수정:

    소켓의 나가는 쪽을 닫아 신호 완료를 알리면 서버가 응답을 보낼 수 있습니다. 잠재적인 데이터 조각화를 처리하기 위해 여러 개의 recv() 작업을 구현합니다.

  • 업데이트된 클라이언트 코드:
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))
  • 업데이트된 서버 코드:

    유지 변경된 프로토콜, 클라이언트가 수신 연결을 닫으면 "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()

위 내용은 클라이언트를 수정하지 않으면 내 Python 소켓이 첫 번째 `recv()` 호출 후 데이터를 수신하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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