2011-02-01 7 views
2

Je me engage les problèmes suivants:un serveur plusieurs clients

  1. que je dois écrire un programme serveur, acceptera plusieurs clients
  2. tous les clients sont abonnés les mêmes données du serveur, par exemple le prix des actions mettre à jour.
  3. chaque client peut envoyer des commandes simples au serveur comme « ouverture de session », « stop »

Voici donc ma solution, puisque je ne suis pas très experianced dans multithread/tcp, je veux savoir est-il un bon Solution? sinon, y a-t-il une meilleure solution? est-il nécessaire d'avoir un thread pour chaque socket client? Merci BTW: désolé de confondre tout le monde, c'est un petit projet qui ne concerne que 5-10 classes.

class AcceptThread { 
    ...... 
    public void run() { 
     ControlThread controlThread = new ControlThread(); 
     controlThread.start(); 

     Socket socket = new Socket(port); 
     while (!stop) { 
      Socket s = socket.accept(); 
      controlThread.addClient (s); 
     } 
    } 
} 

class ControlThread { 
    Set<Scoket> clients; 
    SendDataThread sendDataThread; 

    public ControlThread() { 
     sendDataThread = new SendDataThread(); 
     sendDataThread.start();  
    } 

    public void addClient (Socket socket) { 
     clients.add(socket); 
     sendDataThread.addListener(socket); 
    } 

    public void run() { 
     ...... 
     for (Socket s : clients) { 
      if (s.getInputStream().available()) { 
       //read command from s 
      } 
     } 
     ......    
    } 
} 

class SendDataThread() { 
    Set<Scoket> listeners; 

    public void addListener (Socket s) { 
     listeners.add(s); 
    } 

    public void run() { 
     for (Socket s: listeners) { 
      // send data to each listener 
     } 
    } 
} 
+0

À moins que ce soit des devoirs, vous devriez regarder les solutions existantes comme [JMS] (http://en.wikipedia.org/wiki/Java_Message_Service) au lieu de partir de zéro –

+0

Socket dont 'have have method ... – JasonHuang

Répondre

3

est-il nécessaire d'avoir un fil pour chaque socket client?

Non, en fait, je ne le recommanderais même pas. Si c'est un petit projet et que vous ne voulez utiliser aucune bibliothèque existante, je vous suggère d'utiliser le java.nio package et le SelectableChannels. Avec un soi-disant sélecteur, vous pouvez facilement surveiller les clients pour les données entrantes de manière non bloquante.

Voici quelques liens utiles:

0

Qu'en utilisant la technologie des normes pour résoudre ce problème?

sujet JMS Un mécanisme de distribution pour la publication des messages qui sont livrés aux abonnés multiples.

Tutorial

+1

Je considère que le système JMS est plutôt lourd et ne rapporte pas vraiment à moins d'être utilisé à grande échelle. En outre, vous finirez probablement par utiliser des serveurs d'applications moins légers pour le supporter (par exemple, jboss au lieu de tomcat/jetty). Technique bonne et utile dans le bon projet cependant. –

+0

Vous avez raison, le projet dont je parle est un petit projet, pensez-vous que ma solution est bonne pour un petit projet? – Leon

+0

Absolument, pour moi, c'est la moitié de l'efficacité mais deux fois le plaisir de programmer des sockets. Il existe beaucoup de bonnes aides de haut niveau, mais il n'y a rien de fondamentalement faux dans la programmation de la socket. –

0

Merci BTW: désolé pour la confusion tout le monde, il est un petit projet qui impliquent seulement 5-10 classes.

Il n'y a vraiment rien de mal à cela. Toutes les abstractions de niveau supérieur sont basées sur des sockets d'une manière ou d'une autre. À moins que votre projet ne soit suffisamment important, il n'est pas nécessaire d'utiliser une série d'autres frameworks/toolkit pour effectuer le même travail. Les threads sont bon marché (et peuvent même bénéficier d'une architecture multicœur), bien que l'utilisation de SelectableChannels comme suggéré par @aioobe n'est pas non plus une mauvaise idée. Lorsque vos projets le requièrent, vous pouvez toujours en apprendre davantage sur d'autres méthodes de communication inter-processus (transmission de message, invocaton de méthode à distance, etc., et ses 100 implémentations environ).

Vous pouvez toutefois limiter le nombre de threads que votre serveur utilise simultanément. Ceci peut facilement être réalisé en revendiquant, par exemple, un sémaphore d'une taille égale au nombre de threads que vous voulez servir.Une autre chose intéressante à considérer est l'utilisation de Java thread pools pour mieux réutiliser vos ressources.

+0

Belle réponse. Je ne suis pas d'accord sur un point: l'approche one-thread-per-client n'est pas facilement adaptable aux pools de threads, car l'idée avec un thread par client est qu'elle vous permet d'utiliser le blocage io. Si vous utilisez le blocage io, un pool de threads ne vous fera pas grand chose. – aioobe

-1

D'autres ont mentionné que vous pouvez utiliser la bibliothèque nio pour réduire le nombre de threads nécessaires. Je voulais juste souligner que votre code d'exemple actuel ne fonctionnera pas. vous devez utiliser un thread par socket lors de l'utilisation des flux io standard. la méthode available() est pratiquement inutile (en général) et n'empêchera pas votre thread de contrôle de se bloquer.

+0

downvoter soin de commenter? – jtahlborn

Questions connexes