我一直在使用一些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”循环的代码永远不会运行。这是我被卡住了一段时间的区域,所以如果你有更多的想法,我想在这里有任何想法!