我一直在使用一些Raspberry Pis,Python和一些按鈕/開關進行遊戲。我的遊戲需要一個向多個客戶端發佈命令的中央服務器。Python TCP服務器接受連接和廣播命令
我不是新來的編程,但是對於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個版本的這臺服務器。我嘗試了異步,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
但在「而clientCount」循環的代碼永遠不會運行。這是我被卡住了一段時間的區域,所以如果你有更多的想法,我想在這裏有任何想法!