Теперь в главном разделе или в главном файле после создания объекта сервера запустите начальный поток:

отал над игрой, используя несколько Raspberry Pis, Python и несколько кнопок / переключателей. Моя игра требует центрального сервера, который выдает команды нескольким клиентам.

Я не новичок в программировании, но плохо знаком с Python и сетевым взаимодействием более низкого уровня, и за последние 2 дня терялся в том, как именно написать код моего сервера.

Клиентская программа представляет собой простой socket.connect и затем ожидает отправки данных. Там нет проблем.

Мне было трудно определить, как именно написать и как заставить работать сервер.

Вот как выглядит мой код сервера на данный момент:

import socket, time, sys
import threading

TCP_IP = ''
TCP_PORT = 8888
BUFFER_SIZE = 1024
CLIENTS = {}
clientCount = 0

def listener():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((TCP_IP,TCP_PORT))
    s.listen(5)
    while True:
        conn, addr = s.accept()
        print("new connection from:"+ str(addr))
        #print(len(CLIENTS))
        global clientCount
        clientCount = clientCount+1
        print (clientCount)
        # register client
        CLIENTS[conn.fileno()] = conn


def broadcast():
     for client in CLIENTS.values():
            client.send('this is a broadcats msg')

if __name__ == '__main__':
    listener()

    while clientCount > 0:
        broadcast()
        print(len(CLIENTS)) #print out the number of connected clients every 5s
        time.sleep(5) 

Вот желаемый поток: 1. Сервер запускается и ждет первого подключения или более. Я считаю, что этот "Сервер" должен работать в фоновом потоке? 2. ЕслиconnectionCount > 0 запустите основной программный цикл 3. На данный момент основной программный цикл должен просто отображать количество подключенных клиентов и рассылать всем им сообщения каждые 5 секунд.

У меня около 5 версий этого сервера. Я пробовал async, select.select и несколько многопоточных подходов, но не могу точно описать поведение, которое я ищу. Должен ли я поставить сервер в фоновом потоке? Если так, как транслировать на все соединения?

Единственное, что я не пробовал, это Twisted, и это потому, что я не смог установить его в Windows ... так что я пока управляю этим optino. Если у кого-то есть указатель на то, куда идти, я был бы очень признателен!

Обновить

Хорошо, основываясь на предложении @Armans, я обновил свой код так, чтобы был класс сервера, но он все еще выполняет то же самое.

class server():

    def __init__(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind((TCP_IP,TCP_PORT))
        s.listen(10)
        while 1:
            client_socket, addr = s.accept()
            print ('Connected with ' + addr[0] + ':' + str(addr[1]))
            global clientCount
            clientCount = clientCount+1
            print (clientCount)
            # register client
            CLIENTS[client_socket.fileno()] = client_socket
            threading.Thread(target=self.handler, args=(client_socket, addr)).start() 



    def handler(self, client_socket, addr):
        while 1:
            data = client_socket.recv(BUFFER_SIZE)
            print ('Data : ' + repr(data) + "\n")
            data = data.decode("UTF-8")


    def broadcast(self, message):
        for c in self.CLIENTS:
            c.send(message.encode("utf-8"))

if __name__ == '__main__':
    s = server() #create new server listening for connections

    while clientCount > 0:
        s.broadcast('msg here')
        print(len(CLIENTS)) #print out the number of connected clients every 5s
        time.sleep(5) 

Я могу подключить несколько клиентов, и на консоли отобразится следующее:

Connected with 10.0.0.194:38406
1
Connected with 10.0.0.169:36460
2

Но код в цикле while clientCount никогда не запускается. Это зона, в которой я застрял на какое-то время, поэтому, если у вас есть еще пара идей, я бы с удовольствием высказал любые идеи!

Ответы на вопрос(2)

Ваш ответ на вопрос