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

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

Nov 28, 2024 pm 08:10 PM

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으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? Mar 10, 2025 pm 06:54 PM

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까?

파이썬의 이미지 필터링 파이썬의 이미지 필터링 Mar 03, 2025 am 09:44 AM

파이썬의 이미지 필터링

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Mar 05, 2025 am 09:58 AM

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법

Python을 사용하여 PDF 문서를 사용하는 방법 Python을 사용하여 PDF 문서를 사용하는 방법 Mar 02, 2025 am 09:54 AM

Python을 사용하여 PDF 문서를 사용하는 방법

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Mar 02, 2025 am 10:10 AM

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Mar 10, 2025 pm 06:52 PM

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까?

파이썬 객체의 직렬화 및 사제화 : 1 부 파이썬 객체의 직렬화 및 사제화 : 1 부 Mar 08, 2025 am 09:39 AM

파이썬 객체의 직렬화 및 사제화 : 1 부

파이썬에서 자신의 데이터 구조를 구현하는 방법 파이썬에서 자신의 데이터 구조를 구현하는 방법 Mar 03, 2025 am 09:28 AM

파이썬에서 자신의 데이터 구조를 구현하는 방법

See all articles