Теперь в главном разделе или в главном файле после создания объекта сервера запустите начальный поток:
отал над игрой, используя несколько 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 никогда не запускается. Это зона, в которой я застрял на какое-то время, поэтому, если у вас есть еще пара идей, я бы с удовольствием высказал любые идеи!