簡體   English   中英

防止連接套接字在Python中關閉

[英]Prevent connected socket from closing in Python

我有一個像客戶端一樣的簡單功能。 它會發送一條事件消息並等待確認(為簡單起見,我刪除了該部分)。 之后它會收到更多消息:

def send_data(message):
    """Connect to server and get requests"""
    sock = socket.socket()
    host = 'localhost'
    port = 8000
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host,port))

    try:
        if message:
            sock.sendall(message)

        # Look for the response
        has_request = False
        while not has_request:
            data = sock.recv(1024)

            #First I get ACK, code not listed here...
            #Next iteration, I got my request message
            has_request = True

    finally:
        print >> sys.stderr, 'Closing socket'
        sock.close() 

    return data

我在__main__語句中調用它:

if __name__ == '__main__':
    server_data = send_data(event)

    if server_data:
        parse_request(server_data)

但是我需要防止套接字自動關閉。 因為我在解析請求后必須發送另一條消息。 我刪除了sock.close(),但套接字仍然關閉。 這是因為我正在撤回數據並且我不在函數范圍內嗎?

我只想在我的程序中隨時連接,然后接收和發送消息,沒有任何問題。

當你走到send_data方法之外時,你的套接字sock將不再被任何人引用,所以垃圾收集器將完成他的工作並刪除該對象,這將關閉套接字(即使沒有close()調用)。

如果使用數據返回套接字對象並將其放入主要部分,則套接字仍將被引用而不會關閉。

def create_socket():
    sock = socket.socket()
    host = 'localhost'
    port = 8000
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host,port))
    return sock

def send_data(message, sock):
    """Get requests"""
    if message:
        sock.sendall(message)

    # Look for the response
    has_request = False
    while not has_request:
        data = sock.recv(1024)

        #First I get ACK, code not listed here...
        #Next iteration, I got my request message
        has_request = True
    return data

if __name__ == '__main__':
    server_sock = create_socket()
    server_data = send_data(event, server_sock)

    if server_data:
        parse_request(server_data, server_sock)

    #no more use of server_socket ? 
    server_sock.close()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM