J’essaie de développer un jeu en ligne juste pour le plaisir, avec un serveur et au moins 2 clients jouant dans une seule «pièce». Ma logique est la suivante: tout d’abord, le serveur doit attendre qu’un client se connecte, après la connexion du client au serveur, je crée un thread pour ce client (afin que le client puisse envoyer des messages au serveur lorsqu’il interagit avec l’écran principal). Après cela, si le client veut jouer, il clique sur un bouton qui dit “commencer la partie” et si un autre client fait la même chose, tous les deux vont dans un autre thread pour jouer le jeu uniquement entre eux. Je crée donc un thread pour chaque client qui se connecte et un thread pour chaque 2 clients qui veulent jouer. Maintenant, quand j’ai 2 joueurs jouant le jeu, tout se passe bien, le problème vient du fait que 2 autres joueurs veulent jouer le jeu. Le serveur autonome ne répond plus (mais vous pouvez toujours vous connecter au serveur et envoyer des messages) pour les clients. J’essaie d’apprendre sur le multi-threading c’est pourquoi je fais ce projet alors peut-être que je manque quelque chose. Je devrais créer seulement 2 threads pour chaque client (quand ils sont réellement en jeu sinon 1) et avec 4 clients qui ont un maximum de 8 threads, alors pourquoi mon serveur devient-il si lent et planté?
C’est là que j’accepte mes clients:
private void AcceptTcpClient(IAsyncResult ar) { TcpListener listener = (TcpListener)ar.AsyncState; ServerClient sc = new ServerClient(listener.EndAcceptTcpClient(ar)); sc.SetisInGame(false); // not in game, just in the main menu clients.Add(sc); new Thread(() => MainPanelRoomThread(sc)).Start(); StartListening(); }
Ceci est mon thread lorsqu’un client se connecte:
private void MainPanelRoomThread(ServerClient scThread) { while (true) { if (!serverStarted) return; if (!scThread.GetisInGame()) //check if its not in game so it can receive data { NetworkStream stream = scThread.tcp.GetStream(); if (stream.DataAvailable) { StreamReader streamReader = new StreamReader(stream, true); ssortingng data = streamReader.ReadLine(); if (data != null) OnIncomingData(scThread, data); // waiting for that from the client } } } }
Dans la fonction OnIncomingData, j’attends un message indiquant que le client veut entrer dans un jeu pour pouvoir lancer l’autre thread:
private void OnIncomingData(ServerClient c, ssortingng data) { Debug.Log("Server = " + data); ssortingng[] aData = data.Split('|'); switch (aData[0]) { case "CMATCH": if (aData[1].Contains("true")) { queueClients.Enqueue(c); if (queueClients.Count == 2) new Thread(new ThreadStart(RoomThread)).Start(); //start the Game only if 2 players are waiting for the game to start. else BroadCast("SMATCH|false", c); }else if (aData[1].Contains("false")) { queueClients.Dequeue(); BroadCast("SMATCH|true", c); } break; } }
Enfin la salle de jeux:
private void RoomThread() { ssortingng msg = ""; List players = new List(); List disconnected = new List(); int tamanoCola = queueClients.Count; for(int i = 0; i = 1) return; } }
Toute aide est vraiment appréciée.