2010-12-14 3 views
2

J'essaie de comprendre le multi-threading dans TCP donc je suis en train de coder un "telnet" textuel basique.Envoi d'instructions à un thread qui attend TCP?

En utilisant ReadLine() chaque thread utilisant un programme d'écoute TCP attendra l'entrée du client telnet, puis répondra en fonction du texte envoyé. J'ai ceci fonctionnant avec plusieurs discussions et plusieurs clients de telnet.

Je souhaite envoyer des messages sous conditions à tous les threads. Par exemple, si le texte envoyé à partir d'un thread est "Alerte!" alors je veux que chaque thread pour les clients connectés s'exécute WriteLine("Alert!")

Est-ce logique? Mon problème est que je ne sais pas comment faire qu'un thread soulève un événement dans un autre thread.

Répondre

1

Vous devez regarder un modèle de courtier d'événements. Fondamentalement, vous auriez un objet avec un événement auquel tous vos threads s'abonnent. Il aura également une méthode qui peut être appelée pour invoquer l'événement. Cela peut sembler compliqué, mais c'est assez simple. Par exemple, le code est http://msforge.net/blogs/paki/archive/2007/11/20/EventBroker-implementation-in-C_2300_-full-source-code.aspx.

+0

Oui, c'est un bon début, merci! Maintenant, il y a le prochain problème d'exécution de writeline pour chaque thread ... – Matthew

+1

qui devrait être assez facile à faire dans le eventhandler qui s'abonne à l'événement. –

+0

Des pointeurs? Le problème est que les sessions telnet sont fondamentalement assis sur 'readline' ... comment j'écrirais un' writeline' dans ce même socket à partir d'un eventhandler? Je pense que je devrais créer des sockets statiques? – Matthew

0

Ne pas considérer les threads comme des données. Pensez à eux comme des constructions.

Évidemment, pour que la classe A déclenche un événement dans la classe B, B doit référencer A et s'abonner à son événement.

Mais honnêtement, je pense que vous allez dans le mauvais sens. Avoir un seul écouteur TCP. Lorsqu'un message arrive, vous obtenez un objet de requête Web que vous pouvez traiter dans son propre thread. Lors du traitement du thread, si vous trouvez le mot "Alert", générez un événement à une classe de niveau supérieur. Puis gérer l'événement et faire tout ce qui doit être fait. Exemple d'architecture:

Le gestionnaire instancie TcpHandler et s'abonne à son événement AlertReceived. TcpHandler instancie MessageProcessor et s'abonne à son événement MessageReceived. Lorsque TcpHandler lit quelque chose sur son objet TcpListener, éteignez la classe MessageProcessor et faites-lui lire les données réelles sur un autre thread.

Lance l'événement MessageReceived. Ensuite, dans la classe TcpHandler, gérez l'événement. Si les données reçues sont "Alert", déclenchez l'événement AlertReceived.

La classe Manager va attraper l'événement et faire tout ce que vous désirez.

+0

Si vous exécutez une session Telnet, vous devez garder la connexion ouverte et parler à chaque client doit être fait dans son propre thread. n nombre de clients est égal à n nombre de threads avec chacun son propre écouteur qui attend une entrée du client. –

+0

@Pauli Bon point, n'a pas utilisé telnet dans un bon moment. – AngryHacker

Questions connexes