Sockets 如何在客户端和服务器(python)中正确关闭套接字
我正在用python编写两个脚本 Client.py Server.py 客户端和服务器之间有一个套接字。 情况是这样的: 我有一个客户端要求关闭程序,因此它应该通知服务器,然后服务器将通知另一个客户端,因此我需要关闭客户端1到服务器的套接字,然后关闭服务器到其他客户端的套接字想象自己是一个2人的游戏,其中一人要求退出游戏 我就是这样做的。在Client.py中:Sockets 如何在客户端和服务器(python)中正确关闭套接字,sockets,python-2.7,runtime-error,shutdown,Sockets,Python 2.7,Runtime Error,Shutdown,我正在用python编写两个脚本 Client.py Server.py 客户端和服务器之间有一个套接字。 情况是这样的: 我有一个客户端要求关闭程序,因此它应该通知服务器,然后服务器将通知另一个客户端,因此我需要关闭客户端1到服务器的套接字,然后关闭服务器到其他客户端的套接字想象自己是一个2人的游戏,其中一人要求退出游戏 我就是这样做的。在Client.py中: # send the request to the server eNum, eMsg = Protocol.send_all(se
# send the request to the server
eNum, eMsg = Protocol.send_all(self.socket_to_server, msg)
if eNum:
sys.stderr.write(eMsg)
self.close_client()
self.socket_to_server.shutdown(socket.SHUT_WR)
exit(0)
然后在Server.py的代码中:
# get the msg from the client that calleds
num, msg = Protocol.recv_all(self.players_sockets[0])
# case of failure
if num == Protocol.NetworkErrorCodes.FAILURE:
sys.stderr.write(msg)
self.shut_down_server()
# case it was disconnected
if num == Protocol.NetworkErrorCodes.DISCONNECTED:
print msg
self.shut_down_server()
technical_win = ("exit" == msg)
# send the msg to the client needed to call
eNum, eMsg = Protocol.send_all(self.players_sockets[1],msg)
if eNum:
sys.stderr.write(eMsg)
self.shut_down_server()
# case end of game (winning or asking to exit)
if technical_win:
self.shut_down_server()
当self.shutdown\u服务器时:
当服务器发送另一个玩家要求退出客户端的消息时,获取它,并执行与我在开头所示相同的操作
不幸的是,它无法工作,因为当服务器执行代码时:
num, msg = Protocol.recv_all(self.players_sockets[0])
# case of failure
if num == Protocol.NetworkErrorCodes.FAILURE:
sys.stderr.write(msg)
self.shut_down_server()
# case it was disconnected
if num == Protocol.NetworkErrorCodes.DISCONNECTED:
print msg
self.shut_down_server()
它进入第二个if并打印“错误-无法接收消息:超时”
如何正确地修复此问题
附言
我正在使用Linux看起来您想要的是一个优雅的关机。首先,您的代码不工作,因为您在调用shutdown后立即关闭套接字 规则是,在正常关机时,双方必须意识到关机,并在任何实际关闭套接字之前确认关机。我只在这篇文章中找到了这方面的参考,即使这篇文章引用了这篇文章 以下是一个简化的演示文稿,如果引用的页面我不知道如何正确设置SO中表格的格式,则可以更好地进行解释:-: 第1部分发出ShutdowSocket.SHUT_WR通知它要终止连接,并继续从套接字读取 第2部分接收套接字空读时的文件结束指示,并且仍然可以发送任何剩余数据-然后依次调用shutdownsocket.shutu\WR 第1部分接收套接字上的文件结尾,并知道其他部分已使用连接终止 然后,两个部件都可以关闭插座
备注:第2部分是否在第1部分接收到文件结尾之前关闭套接字并不重要,因为第1部分已经在等待终止指示:没有数据可能丢失。看起来您正在寻找的是一个优雅的关闭。首先,您的代码不工作,因为您在调用shutdown后立即关闭套接字 规则是,在正常关机时,双方必须意识到关机,并在任何实际关闭套接字之前确认关机。我只在这篇文章中找到了这方面的参考,即使这篇文章引用了这篇文章 以下是一个简化的演示文稿,如果引用的页面我不知道如何正确设置SO中表格的格式,则可以更好地进行解释:-: 第1部分发出ShutdowSocket.SHUT_WR通知它要终止连接,并继续从套接字读取 第2部分接收套接字空读时的文件结束指示,并且仍然可以发送任何剩余数据-然后依次调用shutdownsocket.shutu\WR 第1部分接收套接字上的文件结尾,并知道其他部分已使用连接终止 然后,两个部件都可以关闭插座
备注:第2部分是否在第1部分收到文件结束之前关闭套接字并不重要,因为第1部分已经在等待终止指示:没有数据可能丢失与论坛站点不同,我们不使用感谢、感谢的任何帮助或签名。看见顺便说一句,这是提前感谢,而不是提前感谢。不像论坛网站,我们不使用感谢,或任何感谢的帮助,或签名。看见顺便说一句,这是提前感谢,不是提前感谢。
num, msg = Protocol.recv_all(self.players_sockets[0])
# case of failure
if num == Protocol.NetworkErrorCodes.FAILURE:
sys.stderr.write(msg)
self.shut_down_server()
# case it was disconnected
if num == Protocol.NetworkErrorCodes.DISCONNECTED:
print msg
self.shut_down_server()