Python Socket服务器在拥塞的网络上意外关闭连接

时间:2019-02-08 00:28:24

标签: node.js python-2.7 tcp socketserver

我有一个python2.7 Socketserver,它通过拥塞的本地网络响应请求。 (想想运行所述python服务器的计算机集群是通过交换机与单个控制器通信的。)

TCP连接的另一端是一个NodeJS应用程序,它充当服务器的客户端。

大约出现此问题。 1/1000个请求,看似随机。 NodeJS客户端将报告“ ECONNRESET”错误,但是大部分时间都收到了所有数据。在收到所有数据之前,将抛出大约1/10的错误“ ECONNRESET”。

经过大量调查,我发现问题出在SocketServer。我尝试使用C客户端和Python客户端,并且都报告了相同错误的版本。

我还发现(请参见下面的代码)在套接字服务器中,如果我在所有写入之后但在handle函数内返回之前放置“ sleep(0.25)”,则不再发生此错误。 (经过约3,000,000次运行测试)。

这使我相信与套接字服务器存在一些奇怪的交互作用,从而迫使连接关闭,但是较早的数据包之一需要重新传输,或者类似的方式,但是套接字服务器上的文档相当合理点亮。

from time import sleep
import SocketServer

class ThreadedServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

class ThreadedRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        req = parseRequest()
        res = processRequest()
        self.request.send(res)
        sleep(0.25)
        return

def main():
    server = ThreadedServer((parameters.HOST, server_port), ThreadedRequestHandler)
    server.serve_forever()

if __name__ == "__main__":
    main()

我当然已经删除了业务逻辑,但是问题围绕发送之后的睡眠问题。有了它,没有问题,没有它,有时会出现意外的服务器关闭/未发送最后一个数据包。这使我相信这与丢弃的数据包和服务器强制关闭有关,但是可能与其他原因有关。

任何帮助将不胜感激,如果不清楚,我可以澄清。

0 个答案:

没有答案