Сокеты с Python: прослушивание команд для запуска или остановки цикла - PullRequest
0 голосов
/ 19 марта 2020

У меня есть сигнал тревоги, который я хочу запустить в oop. Я хочу иметь возможность запускать и останавливать это l oop удаленно, используя сокеты. У меня проблемы с постоянным прослушиванием команд и включением и отключением этой тревоги l oop.

Есть несколько похожих постов, на которые нет ответов:

Как сделать непрерывное «while l oop» в Python с сокетом, слушающим и ожидающим каждый раз?

Python сокет: попытка получить новое сообщение TCP в течение времени l oop

Проблема в том, что через некоторое время сокет l oop и позволяет запустить аварийный сигнал l oop, но теперь я не могу получить сообщение об остановке , Как мне продолжать слушать, чтобы включить или выключить сигнал тревоги l oop? Ниже моя попытка увидеть, есть ли новые данные (STOP), но затем он останавливает сигнал тревоги l oop для прослушивания входящих сообщений.

import time
import socket
import sys




mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    mysock.bind(("", 1234))
except:
    print("Failed to bind")
    sys.exit()

mysock.listen(5)
while True:
    conn,addr = mysock.accept()
    data = conn.recv(1000)
    state = b"ALARM OFF"
    print(data)
    if not data:
        break
    if data == b'ALARM ON':
        state = b"ALARM ON"
        print(state)
    if data == b'SILENT':
        state = b"ALARM OFF"
        print(state)
    while state == b"ALARM ON":
        print("BEEP BEEP BEEP")
        conn,addr = mysock.accept()
        new_data = conn.recv(1000)
        print(new_data)
        if new_data:
            state == new_data
    print(state)
    conn.sendall(state)
conn.close()
mysock.close()

1 Ответ

0 голосов
/ 19 марта 2020

Я бы использовал поток, чтобы напечатать сообщение снова и снова:

import threading
import time
import socket
import sys

alarm_on = False   # Flag to stop the thread

# The thread function
def thread_function():
    while alarm_on:
        print("BEEP BEEP BEEP")
        time.sleep(1)


mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    mysock.bind(("", 1234))
except:
    print("Failed to bind")
    sys.exit()

thrd = None
mysock.listen(5)
while True:
    conn,addr = mysock.accept()
    while True:
        conn,addr = mysock.accept()
        data = conn.recv(1000)
        state = b"ALARM OFF"
        print(data)
        if not data:
            break
        if data == b'ALARM ON':
            state = b"ALARM ON"
            print(state)
            alarm_on = True
            # Start the thread
            thrd = threading.Thread(target=thread_function)
            thrd.start()
        if data == b'SILENT':
            state = b'ALARM OFF'
            print(state)
            # Set the flag to stop the thread
            alarm_on = False            
        conn.sendall(state)
    conn.close()
mysock.close()
...