Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何在客户端和服务器(python)中正确关闭套接字_Sockets_Python 2.7_Runtime Error_Shutdown - Fatal编程技术网

Sockets 如何在客户端和服务器(python)中正确关闭套接字

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

我正在用python编写两个脚本

Client.py Server.py 客户端和服务器之间有一个套接字。 情况是这样的: 我有一个客户端要求关闭程序,因此它应该通知服务器,然后服务器将通知另一个客户端,因此我需要关闭客户端1到服务器的套接字,然后关闭服务器到其他客户端的套接字想象自己是一个2人的游戏,其中一人要求退出游戏

我就是这样做的。在Client.py中:

# 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()