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