我正在尝试使用 pygame 开发游戏,其中一个功能是玩家可以一起玩(目前在本地网络上)。所以有一个客户端和一个服务器使用套接字编程。客户端和服务器都是类,它们扩展线程:
首先,服务器向下载文件的客户端发送一些数据,然后我希望它们都能监听并能够发送,所以我启动了 2 个新线程: 能够向客户端发送数据,表明他的玩家首先完成了游戏,所以他赢了。另一种方法是不断等待接收数据。服务器和客户端都具有相似的结构。
以下是部分代码:
def demarrerJeu() :
"""démarrage du jeu"""
print("Le jeu commence")
os.system("python menu.py") #launch game window
def boucleReception(soc):
print "Ecoute socket"
global finPartie
finPartie=False
while not finPartie:
newdata = soc.recv(1024)
if not newdata :
pass
try :
dico=json.loads(newdata)
code=dico['code']
scoreClient=dico['score']
if code==1115:
finPartie=True
afficherMessage('L autre a gagné !')
soc.close()
except :
pass
def boucleEnvoi(soc2):
global finPartie
finPartie=False
print "Attente fin de partie"
while not finPartie :
pass
data = { 'code' : 1115}
data_string = json.dumps(data)
soc2.send(data_string)
afficherMessage('Vous avez gagné !!')
soc2.close()
class AServer(threading.Thread):
def run(self):
host = ''
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, self.port))
print 'server started successfully, waiting...'
s.listen(backlog)
while 1:
client, address = s.accept()
client2, address2=s.accept()
#....
thread.start_new_thread(boucleReception, (client, ))
thread.start_new_thread(boucleEnvoi, (client2, ))
break
def main() :
try:
t = AServer(port)
signal(SIGQUIT, process_quit)
t.start()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread();
sys.exit()
问题是仅在我关闭游戏窗口后才执行第二和第三线程的方法(它们应该在控制台中打印的消息仅在我关闭游戏窗口后才显示)。加上方法停止执行,而线程停止的条件不满足(客户端没有发送他赢了的消息)。在我看来,线程没有正确执行?