如何使TCP连接尽可能长寿,以接收数据

时间:2019-04-26 11:46:13

标签: python sockets networking server

我正在用python编写一个多处理服务器,以接收来自多个客户端的数据。建立新连接后,首先数据传输正常。创建一个新的过程来接收和处理数据流。如果客户端主动断开与服务器的连接,则会关闭套接字并终止进程。


到目前为止,一切正常。但是,当数据传输暂停一会儿时, recv()函数似乎关闭并且无法再接收新数据。但是,根据 recv()的返回值,连接似乎很好。尽管该进程仍然存在,但客户端仍必须重新连接服务器,这使得服务器为其创建了一个新进程。

这是我服务器的主要代码:

def main():
    with socket(AF_INET, SOCK_STREAM) as s:
        s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        address = ('', 7788)
        s.bind(address)
        s.listen()
        while True:
            print('WAITING FOR CONNECTIONS...')
            newConn, newAddr = s.accept()
            with newConn:
                print('%s CLIENT ACCEPTED...' % newAddr[0])
                p = Process(target=recv, args=(newConn, newAddr))
                p.start()

def recv(newConn, newAddr):
    while True:
        recvData = newConn.recv(1024)
        if len(recvData) > 0:
            dataprocessing(recvData)
        else:
            print('%s CLIENT DISCONNECTED' % newAddr[0])
            break

我希望每个连接都可以保持尽可能长的生命周期,以便随时从客户端接收新数据。我的服务器为什么运行不正常?值得注意的是,当连接似乎已死时,它既不处理新数据也不打印“ CONNECTION DISCONNECTED”信息。为什么会这样?

1 个答案:

答案 0 :(得分:2)

尝试设置timeout以及更好的异常处理和重新连接机制。您还应该参考setblocking