我正在尝试用python套接字构建一个简单的服务器客户端聊天室
我有以下代码:
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}
我的问题是:如果client.recv()
由于客户端CLI关闭而在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()
应该返回message的值,或者在出现连接问题时抛出ConnectionError
。如果没有来自套接字的消息,则可以返回None
或引发NoMessagesAvailableError
还有一条规则告诉您应该捕获指定的异常,而不是所有异常。内存不足时,代码将打印
client disconnected
相关问题 更多 >
编程相关推荐