我的套接字有问题,它运行良好但是当我关闭客户端/关闭客户端窗口时,服务器丢失了连接(服务器需要保持打开并等待其他连接)
while True:
rlist, wlist, xlist = select.select([server_socket]+open_client_sockets, open_client_sockets, [])
for current_socket in rlist:
if current_socket is server_socket:
(new_socket, address) = server_socket.accept()
open_client_sockets.append(new_socket)
print 'new member : ' + str(address)
else:
data = current_socket.recv(1024)
print data
if data == "":
open_client_sockets.remove(current_socket)
print 'Connection with client closed.'
else:
send_messages(data)
问题出在这一部分 -
if data == "":
open_client_sockets.remove(current_socket)
print 'Connection with client closed.
这是错误 -
data = current_socket.recv(1024)
error: [Errno 10054] An existing connection was forcibly closed by the remote host
我在之前的套接字中没有收到此错误
答案 0 :(得分:1)
当客户端正常关闭套接字(例如client_socket.shutdown(socket.SHUT_WR)
)时,服务器将接收所有数据,然后其下一个recv
调用将获得0个字节。你为这个案子编了代码。
当客户端退出而没有正常关闭时,底层套接字实现将执行非正常终止,包括向服务器发送RESET
。在这种情况下,服务器会获得您已经看到的异常。这意味着在套接字级别,无法保证服务器接收到所有数据。
您应该更新您的客户,使其在关闭时更加优雅,并决定您的政策应该在非正常退出时采取什么措施。