我试图用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}
我的问题是:如果由于客户端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
在存在连接问题时返回message的值或引发。如果套接字没有消息,则可以返回None
或引发NoMessagesAvailableError
。
还有一条规则告诉您应捕获指定的异常,而不是所有异常。client disconnected
内存不足时,将打印代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句