Как обнаружить сокет / соединение внезапно закрывается в Python 3.6 - PullRequest
0 голосов
/ 05 мая 2019

Как я могу проверить, внезапно ли клиент отключился в Python 3.6. Вот мой код,

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')

try:
    s.bind((HOST, PORT))
    print('Socket binding complete')
except socket.error as socketError:
    print('socket binding failed, ', socketError)

s.listen(1)
print('Socket listening for connection...')

conn, addr = s.accept()
conn.setblocking(0)
print('connected to ', addr[0])

try:
    while True:
        temp = conn.recv(1024)
        if not temp:
            break
        data = int.from_bytes(temp, byteorder='big', signed=True)
        print('value received,', temp)
        print('converted value = ', data)
except Exception as loopException:
    print("Exception occurred in loop, exiting...", loopException)
finally:
    conn.close()
    s.close()

Это работает, если клиент нормально отключается, он правильно закрывает соединение. Как я могу проверить, внезапно ли клиент отключился?

1 Ответ

0 голосов
/ 05 мая 2019

Вы можете вначале попытаться отправить клиенту пакет, и с его помощью вы можете увидеть, подключен ли вы к клиенту или нет

while True:
    try:
        string = "Are you up?"
        s.send(string.encode())
    except:
        print("Can't seem to be connected with the client")
        # here you can process the expection
    # rest of the code

И в вашем случае вы уже используете неблокирующий сокет conn.setblocking(0), поэтому даже если клиент завершит сеанс и вы не получите никаких данных temp, переменная не будет содержать ничего, и вы выйдете из цикла (Это если клиент, если клиент отправляет данные вкаждый цикл)

Или вы также можете установить тайм-аут для ответа от клиента

s.settimeout(30) # wait for the response of the client 30 seconds max

и в строке recv вы можете сделать:

try:
    temp = conn.recv(1024)
except socket.timeout:
    print('Client is not sending anything')
...