有没有办法检查套接字是否仍在运行?

时间:2019-11-21 07:36:55

标签: python sockets networking

我需要在两个客户之间聊天。但是我不知道什么时候关闭插座,有没有办法检查插座是否闭合?

这是我需要修复的代码部分:

def main():
    """Implements the conversation with server."""
    # Open client socket, Transport layer: protocol TCP, Network layer: protocol IP
    client_socket = socket.socket()
    client_socket.connect((HOST_IP, PORT))

    # start conversation with new client in parallel thread
    name = input("enter your name ")
    protocol.send_request(client_socket, name)
    thread_for_responses = threading.Thread(target=get_responses,
                                            args=(client_socket, ))
    thread_for_responses.start()

    while True:
        # Get request from keyboard
        client_request_str = input()
        if client_request_str:  # if client_request_str not empty string
            # send request according to the protocol
            protocol.send_request(client_socket, client_request_str)
            # Get response from server

我需要检查套接字是否已关闭,而不是while True,以免它陷入因使用闭合的套接字而崩溃的循环。

1 个答案:

答案 0 :(得分:0)

Python程序员通常说,请求宽恕比请求许可容易。他们的意思是“处理异常”。

例如,您不能除以零。您可以通过以下两种方式处理此事实:

def print_quotient(a, b):
    if b == 0:
        print("quotient is not a number")
    else:
        print("quotient is {}".format(a / b))

vs

def print_quotient(a, b):
    try:
        print("quotient is {}".format(a / b))
    except ZeroDivisionError:
        print("quotient is not a number")

这些函数的行为方式相同,因此采用哪种方法并没有太大区别。这是因为b无法更改。这与您可以更改套接字 的示例不同。外部因素会影响其状态,这会改变尝试使用它的行为(例如,随其发送字节)。在这种情况下,异常处理是上乘的,因为它不必试图确保什么都不会出错,它只会在出错时处理事情。在任何情况下,代码都不会认为它已使一切正常工作,然后发现它遗漏了一些东西。

因此,当您使用套接字操作时,应对那些操作可能引起的任何异常进行异常处理。