>백엔드 개발 >파이썬 튜토리얼 >Python 소켓 서버에서 데이터 에코를 제거하면 `socket.recv()`가 후속 호출에서 아무것도 반환하지 않는 이유는 무엇입니까?

Python 소켓 서버에서 데이터 에코를 제거하면 `socket.recv()`가 후속 호출에서 아무것도 반환하지 않는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-27 03:37:22993검색

Why Does Removing Data Echoing from a Python Socket Server Cause `socket.recv()` to Return Nothing on Subsequent Calls?

Python 소켓: 데이터 반환 동작의 영향 이해

처음에는 공식 문서에 있는 Python 에코 서버 예제가 완벽하게 작동했습니다. 그러나 클라이언트로 다시 데이터를 보내는 것을 제거하기 위해 코드를 수정하자 문제가 발생했습니다. Socket.recv() 메소드의 두 번째 호출에서는 반환이 발생하지 않았습니다.

다른 구현, 다른 결과

문서의 원본 코드는 다음과 같은 while 루프를 사용했습니다.

conn.sendall(data)

이 줄은 다음과 같습니다. 클라이언트가 연결을 종료할 때까지 서버는 수신된 데이터를 클라이언트에 다시 표시합니다.

수정된 코드에서 동작은 다음과 같이 변경되었습니다.

break</pre&gt ;<br>conn.recv(1024) 메소드가 두 번째로 호출되면 즉시 종료되어 해당 메소드에 사용할 수 있는 데이터가 남지 않습니다. client.</p><p><strong>TCP 스트림의 특성</strong></p><p>이 동작을 이해하려면 TCP 스트림의 특성을 이해하는 것이 중요합니다. 클라이언트와 서버 작업 간에 직접적인 상관 관계 없이 연속적인 흐름으로 데이터를 전송합니다. 또한 프로토콜은 기본 통신 규칙을 결정합니다.</p><p>원래 코드에서 프로토콜은 클라이언트가 나가는 연결을 닫을 때까지 서버가 수신한 각 데이터 패킷을 에코하도록 지정했습니다. 닫히면 서버는 소켓을 닫습니다.</p><p><strong>수정된 프로토콜 및 클라이언트 조정</strong></p><p>수정된 코드는 클라이언트가 클라이언트에 도달할 때까지 서버가 들어오는 데이터를 삭제하는 새로운 프로토콜을 도입했습니다. 나가는 연결을 닫았습니다. 그 후 서버는 "ok"를 보내고 소켓을 닫습니다.</p><p>클라이언트가 이 새로운 프로토콜과 작동하도록 하려면 다음을 수행해야 합니다.</p><ol><li>클라이언트의 나가는 연결을 닫습니다. 완료를 나타냅니다.</li><li>데이터의 잠재적 조각화를 고려하기 위해 여러 개의 recv() 호출을 구현합니다. </li></ol><p><strong>업데이트된 서버 및 클라이언트</strong></p><p>다음 업데이트된 코드 샘플은 수정된 프로토콜 구현을 보여줍니다.</p><p>서버:</p><p><사전>가져오기 소켓</p>
<p>HOST = ''<br>PORT = 50007 <br>s = 소켓.socket(socket.AF_INET, 소켓.SOCK_STREAM)<br>s.setsockopt(socket.SOL_SOCKET, 소켓.SO_REUSEADDR, 1)<br>s.bind(( 주인, PORT))<br>s.listen(1)</p>
<p>conn, addr = s.accept()<br>print('Connected by', addr)</p>
<p>while 참:</p>
<pre class="brush:php;toolbar:false">data = conn.recv(1024)
if not data: break

conn.sendall(b'ok')
conn.shutdown(socket.SHUT_WR)
conn.close()

클라이언트:

<사전>가져오기 소켓

HOST = 'localhost'
PORT = 50007
s = 소켓.socket(socket.AF_INET, 소켓.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall (b'안녕하세요. world')
s.shutdown(socket.SHUT_WR)
data = b''
while True:

data = conn.recv(1024)
if not data: break

s.close()
print('Received' , repr(data))

이러한 수정된 구현을 통해 서버는 들어오는 데이터를 효율적으로 삭제하여 클라이언트가 종료 후 응답을 받을 수 있도록 합니다.

위 내용은 Python 소켓 서버에서 데이터 에코를 제거하면 `socket.recv()`가 후속 호출에서 아무것도 반환하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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