Je suis en train de tenter d'évaluer le meilleur choix en terme d'utilisation CPU, mémoire et encombrement réseau dans le cadre d'un serveur en mode TCP. Ce serveur sera multi-threading car multi-utilisateur.
Chaque client est associé à un ID, un socket, un objectInputStream dans un thread et un objectOutputStream.
J'hésite entre 3 choix :
1/ Utiliser une hashMap avec un couple clé-valeur pour stocker le couple ID-socket. Avantage : pas de mémoire utilisée pour stocker l'objectOutputStream. Inconvénient : je dois créer un nouvel ObjetOutputStream chaque fois que je veux envoyer un message et l'instanciation d'un objet semble être une tache gourmande en terme d'utilisation du processeur. De plus, cette création est peut être aussi consommatrice de bande passante.
2/ Utiliser une ArrayList pour enregistrer tous les sockets pour le cas où je doive arrêter le serveur et donc, fermer proprement toutes les sockets ; et stocker dans une HashMap le couple ID-ObjectOutputStream. Avantage : pas de perte de temps à créer un nouvel ObjectOutputStream chaque fois que je veux envoyer un message. Inconvénient : je consomme de la mémoire pour stocker les ObjectOutputStream.
3/ Toute autre solution élégante à laquelle je n'aurais pas pensé
Note : j'ai besoin d'un ID pour les clients car cette valeur, associée au message, sera utilisée pour savoir à qui le serveur doit répondre après que le message reçu aura été traité dans un "MessageProcessor".
Quelle serait la meilleure solution, et pourquoi ?
La place prise en mémoire par les éléments que tu cites (ObjectInputStream, Socket, ID...) ne devrait vraiment pas être une préoccupation pour toi, surtout en Java puisque tu ne gères pas la mémoire. Donc même si tu supprimes un objet, rien ne garantit qu'il sera libéré par la JVM immédiatement. De plus, ce sont des tailles ridicules par rapport à la mémoire dont tu disposes normalement sur un serveur. Donc tu devrais choisir la solution qui semble la plus propre et la plus sécurisée.
Ce serveur sera multi-threading car multi-utilisateur.
Il n'y a pas de lien de causalité dans cette phrase. Si tu fais un thread par utilisateur, ton serveur consommera simplement bien plus de ressource que ce qu'il a besoin.
Ce serveur sera multi-threading car multi-utilisateur.
Il n'y a pas de lien de causalité dans cette phrase. Si tu fais un thread par utilisateur, ton serveur consommera simplement bien plus de ressource que ce qu'il a besoin.
Je souhaite que mon serveur écoute plusieurs clients à la fois (car je ne sais jamais quel client parlera ni quand) donc j'ai créé une classe "Recepteur" de type Runnable. J'utilise une instance de cette classe pour chaque client et à l'instanciation, je crée un ObjectInputStream. Une fois cette instance créée, je lance ma méthode "Run" qui contient une boucle infinie.
La classe du récepteur est donc codée comme suit :
Si je ne créait pas un Thread pour chaque "Recepteur", comment je pourrais écouter tous les clients en même temps ? Je suis preneur si tu as une idée plus élégante et performante.
Tu devrais te tourner vers la sélection de socket.
Heu... c'est à dire ?
Dr_Click
Optimisation du ration CPU/mémoire /réseau
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C