내 server.py 파일에 다음 코드가 있습니다. 클라이언트로부터 데이터를 수신하기 위해 대기 중입니다. 또한 나는 어떤 http 라이브러리도 사용할 수 없다. 만 소켓 라이브러리 :소켓 API를 사용하여 기본 HTTP 서버 작성
def handle_client(conn, addr):
print ('New client from', addr)
x = []
try:
while True:
data = conn.recv(1024)
decoded_data = data.decode('utf-8')
# if "GET/" in data.decode('utf-8'):
# handle_client_get(conn)
# else:
if data:
print(data)
x.append(decoded_data)
else:
print(x)
break
finally:
print("in close now")
conn.close()
오전 데 문제는 내가 수동으로 CTRL + C
클라이언트를 닫으면 나는 단지 print(x)
문에 도달 할 수 있다는 것입니다. 그렇지 않으면 인쇄되지 않습니다.
왜 그런가요?
답변
당신은 전송 데이터가 정확하게 수신 된하도록 클라이언트에 승인을 보내야합니다.
연결을 종료하고 제한 시간을 기다리지 않습니다. Expect: 100-continue
그리고 당신은 클라이언트
다른 쪽이 소켓을 닫지 않았습니다. 수신 채널이 상대방에 의해 종료 된 후에 만 비어있는 recv를 받게됩니다. – tdelaney
하지만 데이터가 클라이언트에서 전송되지 않는 경우 어떻게 중단시킬 수 있습니까? 연결이있는 한 클라이언트에서 데이터가 전송되지 않아도 else 문을 사용할 수 없다는 말입니까? – user3450754
더 나은 답변을 얻으려면 프로토콜을 정의해야합니다. 더 많은 데이터를 수신하는 데 예상되는 시간대가 있습니까? 작업이 완료되면 서버가 연결을 계속 열어 두는 이유는 무엇입니까? 일부 프로토콜 (예 : telnet 또는 ssh)은 몇 분 또는 몇 시간 동안 데이터가 없을 수 있지만 연결이 유효하며 데이터가없는 기간이 지나면 더 많은 데이터가있을 수 있습니다. – dsh