Python цикл while

Рейтинг: 0Ответов: 1Опубликовано: 18.02.2023

У меня есть вот такой простой код и в нем два цикла для того чтобы при отключении клиента он мог подключится обратно но я хочу чтобы по команде exit полностью завершился весь скрипт но 1 цикл просто не даст этого сделать, что можно сдеалать и изменить чтобы можно было завершить скрипт или завершить сразу 2 цикла

def start_anigilation():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = '127.0.0.1'
    port = 4444
    server.bind((host, port))
    server.listen(2)
    while True:
        try:
            client, addr = server.accept()
            print(client)
            while True:
                message = client.recv(1024).decode('utf-8')
                if message == 'user-exit':
                    break
                elif message == 'hi':
                    print(message)
                    client.send('Hello'.encode('utf-8'))
                else:
                    break
        except:
            break

Код клиента

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1'
port = 4444
client.connect((host, port))


def main():
    commands = str(input('>>> ')).encode('utf-8')
    if commands == 'exit':
        raise SystemExit
    elif commands == 'user-exit':
        client.send('user-exit'.encode('utf-8'))
    else:
        pass

main()

Ответы

▲ 2Принят

Вместо True в верхнем цикле заводим переменную server_running с значением True, перед break переводим ее в False

def start_anigilation():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = '127.0.0.1'
    port = 4444
    server.bind((host, port))
    server.listen(2)
    server_running = True
    while server_running:
        try:
            client, addr = server.accept()
            print(client)
            while True:
                message = client.recv(1024).decode('utf-8')
                if message == 'user-exit':
                    server_running = False   
                    break
                elif message == 'hi':
                    print(message)
                    client.send('Hello'.encode('utf-8'))
                else:
                    break
        except:
            break

В приведеном коде клиента есть ошибка в строке:

commands = str(input('>>> ')).encode('utf-8')

Дело в том что произведя энкодинг тут мы не получим четкого сравнения в условии:

commands == 'user-exit': 

По этой причине энкодинг при вводе делать не стоит.

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1'
port = 4444
client.connect((host, port))


def main():
    commands = str(input('>>> '))
    if commands == 'exit':
        raise SystemExit
    elif commands == 'user-exit':
        client.send('user-exit'.encode('utf-8'))
    else:
        pass

main()