0

我正在尝试使用 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()

问题是仅在我关闭游戏窗口后才执行第二和第三线程的方法(它们应该在控制台中打印的消息仅在我关闭游戏窗口后才显示)。加上方法停止执行,而线程停止的条件不满足(客户端没有发送他赢了的消息)。在我看来,线程没有正确执行?

4

0 回答 0