3

クライアントのように機能するシンプルな機能があります。イベントメッセージを送信し、ackを待ちます(簡単にするためにその部分を削除しました)。その後、さらに多くのメッセージを受信します。

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()を削除しましたが、ソケットはまだ閉じています。これは、データを取得していて、関数の範囲外にあるためですか?

プログラム内でいつでも接続して、問題なくメッセージを送受信したいだけです。

4

1 に答える 1

2

メソッドの外に出る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()
于 2012-07-25T13:39:31.590 に答える