문제:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!