내 Python 소켓이 데이터를 전송하지 않고 수신하지 못하는 이유는 무엇입니까?
Python 소켓이 전송 없이 수신되지 않음
이 질문은 Python 문서의 수정된 소켓 예제가 데이터 수신에 실패하는 문제에 대해 자세히 설명합니다. 초기 전송이 비활성화되었습니다. 문제는 데이터를 연속 스트림으로 처리하는 TCP 소켓의 고유한 특성으로 인해 발생합니다.
원래 예에서 while 루프는 서버가 수신한 모든 메시지를 반향하도록 보장했습니다. 이로써 전송이 응답을 유발하는 간단한 프로토콜이 확립되었습니다.
그러나 수정된 버전에서는 에코 기능을 제거하면 프로토콜이 중단됩니다. 서버는 클라이언트가 연결을 닫을 때까지 기다리는 무한한 데이터 소비자가 됩니다. 보내기가 비활성화되었기 때문에 클라이언트의 데이터가 확인되거나 다시 에코되지 않아 응답을 기다리는 동안 응답이 중단됩니다.
해결책은 클라이언트의 동작을 새 프로토콜에 적응시키는 것입니다. 즉각적인 응답을 기대하는 대신 클라이언트는 연결 끝을 정상적으로 닫아야 합니다. 이는 데이터 전송이 완료되었음을 서버에 알리고 서버가 예상한 "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()
클라이언트
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))
이러한 수정 사항을 따르면 예제에서는 클라이언트가 중단되지 않으며 서버의 즉각적인 응답 없이도 서버가 데이터 교환을 원활하게 처리합니다.
위 내용은 내 Python 소켓이 데이터를 전송하지 않고 수신하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











Linux 터미널에서 Python 버전을 보려고 할 때 Linux 터미널에서 Python 버전을 볼 때 권한 문제에 대한 솔루션 ... Python을 입력하십시오 ...

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

Python의 Pandas 라이브러리를 사용할 때는 구조가 다른 두 데이터 프레임 사이에서 전체 열을 복사하는 방법이 일반적인 문제입니다. 두 개의 dats가 있다고 가정 해

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

Uvicorn은 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 ASGI를 기반으로 한 가벼운 웹 서버입니다. 핵심 기능 중 하나는 HTTP 요청을 듣고 진행하는 것입니다 ...

Linux 터미널에서 Python 사용 ...

Investing.com의 크롤링 전략 이해 많은 사람들이 종종 Investing.com (https://cn.investing.com/news/latest-news)에서 뉴스 데이터를 크롤링하려고합니다.
