>백엔드 개발 >파이썬 튜토리얼 >서버가 수신된 데이터를 반향하지 않을 때 TCP 소켓 동작은 어떻게 변경됩니까?

서버가 수신된 데이터를 반향하지 않을 때 TCP 소켓 동작은 어떻게 변경됩니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-03 03:36:13267검색

How Does TCP Socket Behavior Change When a Server Doesn't Echo Back Received Data?

TCP 소켓 통신: 소켓 동작 이해

Python에서 TCP 소켓으로 작업할 때 이러한 소켓의 스트림 기반 특성을 이해하는 것이 중요합니다. 사이. 보내기 작업과 받기 작업 간의 일대일 관계와 달리 데이터 흐름은 구현된 프로토콜에 따라 결정됩니다.

간단한 에코 서버에 대해 다음 코드 조각을 고려하세요.

import socket

HOST = ''
PORT = 50007

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)

while True:
    data = s.recv(1024)
    if not data: break
    s.sendall(data)

원래 형식에서 이 코드는 클라이언트와의 연결을 설정하고 클라이언트로부터 데이터를 기다린 후 클라이언트 연결이 끊어질 때까지 이를 다시 에코합니다. 루프는 서버가 들어오는 각 메시지를 수신하고 응답하면서 반복적으로 반복됩니다.

그러나 서버가 클라이언트에 데이터를 다시 보내는 단계를 제외하도록 코드를 수정한다고 가정해 보겠습니다.

import socket

HOST = ''
PORT = 50007

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)

while True:
    data = s.recv(1024)
    if not data: break

이 시나리오에서는 recv 메서드의 동작이 변경됩니다. 수정된 서버는 클라이언트와 연결을 설정하면 데이터를 기다립니다. 그러나 데이터가 전송되지 않으므로 recv 메서드는 무기한 차단됩니다. Recv에 대한 두 번째 호출은 절대 발생하지 않으므로 서버가 클라이언트의 연결 끊김을 인식하지 못합니다.

이 동작을 이해하려면 TCP 소켓이 데이터 스트림으로 작동한다는 점을 기억하는 것이 중요합니다. 데이터 전송 및 수신은 서로 직접적으로 연결되어 있지 않습니다. 통신을 관리하는 규칙은 구현된 프로토콜에 따라 결정됩니다. 원래 코드에서 프로토콜은 서버가 클라이언트로부터 수신한 모든 데이터를 반향하도록 지시했습니다.

수정을 통해 프로토콜이 변경됩니다. 이제 서버는 클라이언트로부터 데이터만 수신하고 이를 버립니다. 클라이언트는 데이터를 보낸 후 응답을 기대하지만 수정된 서버는 침묵을 유지합니다. 이 문제를 해결하려면 클라이언트는 나가는 연결을 닫아 데이터 전송을 완료했음을 명시적으로 나타내야 합니다. 이런 일이 발생하면 서버는 빈 수신 호출을 수신하고 이를 연결 끊김으로 해석한 후 "OK" 메시지 전송을 진행합니다.

게다가 실제 시나리오에서는 전송 중에 데이터 패킷이 조각화될 수 있습니다. 이를 설명하기 위해 보다 강력한 클라이언트 구현에서는 모든 데이터가 수신될 때까지 여러 개의 recv 호출을 수행합니다.

다음은 이러한 문제를 해결하는 업데이트된 버전의 서버 및 클라이언트 코드입니다. 문제:

서버:

import socket

HOST = ''
PORT = 50007

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)

while True:
    data = s.recv(1024)
    if not data: break
    s.sendall(b'ok')
    s.shutdown(socket.SHUT_WR)
    s.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()

이러한 변경 사항을 구현하여 다음을 보장합니다. 서버와 클라이언트 간의 통신은 연결 끊김을 인식하고 데이터 조각화를 처리하여 의도한 대로 작동합니다.

위 내용은 서버가 수신된 데이터를 반향하지 않을 때 TCP 소켓 동작은 어떻게 변경됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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