dushu_pitona
@dushu_pitona

Как реализовать выход из программы или закрытие cmd консоли при вводе 'stop'?

Клиент подает на сервер данные, сервер их как-то обрабатывает и отсылает. Необходимо чтобы при вводе в cmd 'stop' сервер останавливался, или просто закрывалась консоль. Для этого написал два процесса:
1.)print_thread - ловит 'stop' в консоли
2.)client_thread - обрабатывает файл и отправляет клиенту
А дальше не знаю, что делать, из за бесконечного цикла, который ловит сообщения от клиента, не получается завершить с помощью exit() в print-prompt()
Код:
import socket
import sys
import os
import threading


class Server:
    def __init__(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_address = ('localhost', 10000)
        self.print_thread = None
        self.client_thread = None

    def handle_client(self, connection, client_address):
        try:
            print('Подключено к:', client_address)
            while True:
                data = connection.recv(16)
                print(f'Получено: {data.decode()}')
                if data:
                    print('Обработка данных...')
                    data = data.upper()
                    print('Отправка обратно клиенту.')
                    connection.sendall(data)
                else:
                    print('Нет данных от:', client_address)
                    break

        finally:
            connection.close()

    def start_sock(self):
        self.sock.bind(self.server_address)
        self.sock.listen(1)

    def connect(self):
        print('Ожидание соединения...')
        connection, client_address = self.sock.accept()
        self.client_thread = threading.Thread(target=self.handle_client, args=(connection, client_address))
        self.client_thread.start()


def print_prompt():
    while True:
        command = input()
        if command == 'stop':
            print('Это stop')


if __name__ == '__main__':
    print_thread = threading.Thread(target=print_prompt)
    print_thread.start()
    server = Server()
    server.start_sock()
    while True:
        server.connect()
  • Вопрос задан
  • 79 просмотров
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
Грубое решение: настрой таймаут чтения, и при таймауте проверяй логическую переменную, которая хранит признак "пора остановиться". Тогда если ты эту переменную взведёшь, твои потоки-клиенты отвалятся, пусть и не сразу.
Ответ написан
Комментировать
LaRN
@LaRN
Senior Developer
В модуле trading есть инструменты для взаимодействия потоков, например класс Event.
Вы можете в одном потоке объект этого класса активирова, а в другом проверять активет ли этот объект или нет. Вот тут есть пример и описание
https://www.pythontutorial.net/python-concurrency/...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
16 мая 2024, в 21:15
5000 руб./за проект
16 мая 2024, в 20:50
5000 руб./за проект