파이썬 소켓으로 간단한 서버-클라이언트 채팅방을 구축하려고합니다.
다음 코드가 있습니다.
def handle_connection(client):
while(1):
try:
message = receive_message()
broadcast(message["data"])
except: # for now i don't mind which exception
print("client disconnected")
def receive_message(client_socket):
try:
message_header = client_socket.recv(HEADER)
if len(message_header) == 0:
return False
message_length = int(message_header.decode("utf-8"))
message = client_socket.recv(message_length).decode("utf-8")
return {"header": message_header, "data": message}
except: # most likely will trigger when a client disconnects
return False
어디 receive_message()
그것의 내부에 대한 호출 client.recv(HEADER)
과 반환 중 False
어떤 메시지가없는 경우, 또는 {"header": msg_header, "data": msg}
모든 것이 확인됩니다.
내 질문은 : 클라이언트 CLI client.recv()
가 닫혀서 내부에 실패 receive_message()
하면 예외가 발생하고 인쇄 "client disconnected"
됩니까?
나는 작동한다고 생각하는 다음 솔루션을 생각해 냈습니다.
위 코드에서 handle_disconnection()
내부의 모든 내용을 처리 하는 함수를 정의했습니다 except
.
def handle_connection(client_socket):
while 1:
try:
message = receive_message()
if not message:
handle_disconnection(client_socket)
break
broadcast(message["data"])
except: # client disconnected
handle_disconnection(client_socket)
break
이것이 문제에 대한 유효하고 올바른 프로그래밍 접근 방식입니까? 이 접근 방식이 잘못된 경우 어떻게 올바르게 처리 할 수 있습니까?
경우 client.recv()
예외가 발생합니다 당신의 내부에 그것을 처리 할 receive_message()
및 handle_connection()
예외를받을 수 없습니다.
예외 또는 if-else로 흐름을 제어하려는 상황을 식별하는 것이 좋습니다. 연결 문제가있을 때 receive_message()
메시지 값을 반환하거나 던져야 한다고 생각 합니다 ConnectionError
. 소켓에서 메시지가없는 경우 반환 None
하거나 발생시킬 수 있습니다 NoMessagesAvailableError
.
모든 예외가 아닌 지정된 예외를 포착해야한다는 규칙도 있습니다. client disconnected
메모리가 부족하면 코드가 인쇄 됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다