0

私はpygameでゲームを開発しようとしていますが、機能の1つは、プレーヤーが(今のところローカルネットワーク上で)一緒にプレイできることです。したがって、ソケットプログラミングを使用するクライアントとサーバーがあります。クライアントとサーバーはどちらもクラスであり、スレッドを拡張します。

最初にサーバーがファイルをダウンロードするクライアントにデータを送信し、次にファイルをリッスンして送信できるようにしたいので、2つの新しいスレッドを開始します。プレーヤーが最初にゲームを終了したことをクライアントにデータを送信できるようにします。彼は勝った。もう1つの方法は、データの受信を常に待機しています。サーバーとクライアントの両方が同様の構造を持っています。

コードの一部を次に示します。

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()

問題は、2番目と3番目のスレッドであるメソッドが、ゲームウィンドウを閉じた後にのみ実行されることです(コンソールに出力されるはずのメッセージは、ゲームウィンドウを閉じた後にのみ表示されます)。さらに、メソッドは実行を停止しますが、停止するスレッドの条件は満たされていません(クライアントは勝ったというメッセージを送信しませんでした)。スレッドが正しく実行されていないように見えますか?

4

0 に答える 0