2011-03-19 5 views
0

J'ai besoin d'écrire un client TCP threadé en Java mais je ne suis pas sûr de la meilleure façon de le structurer. Je voudrais que le client fonctionne sur un autre thread afin de ne pas bloquer le thread principal.Comment structurer un client TCP threadé en Java

Idéalement, je voudrais créer le client sur le thread principal, puis demander au client de se connecter au serveur. La connexion qui peut prendre un certain temps se passerait sur un autre thread. Une fois que le client s'est connecté, il notifie le thread principal et commence à écouter les messages entrants provenant du serveur. Le thread principal est notifié lorsque des messages sont reçus.

Pour le moment, mon plan est d'avoir une classe de client TCP implémentable Runnable et d'effectuer à la fois la connexion et la réception dans la méthode d'exécution.

J'aimerais savoir comment structurer le client tcp.

+0

Question 1. S'agit-il d'une application GUI ou d'une application de ligne de commande ou par ex. une partie non-itérative d'un système plus grand? – KarolDepka

+0

Question 2. Que voulez-vous dire par "notifier le fil principal"? – KarolDepka

+0

Question 3. Pourriez-vous donner plus de détails sur le type de protocole? et comment les messages doivent-ils aller et venir? – KarolDepka

Répondre

1

Quelques éléments à prendre en compte lors de la structuration de votre application:
1. Idéalement, des threads séparés doivent être utilisés pour lire et écrire les flux réseau. Sinon, il peut y avoir des problèmes.
2. Si vous voulez "informer" d'autres threads sur quelque chose ou passer quelque chose, considérez l'idiome/l'objet Java "Condition" et/ou les files d'attente/Deques bloquantes.

+0

J'utilise java.util.concurrent.LinkedBlockingDeque pour mettre en file d'attente les choses qui vont être envoyées via le réseau. – KarolDepka

+0

Quelque chose qui peut aussi vous aider: un croquis d'une "machine d'état" (un peu comme http://en.wikipedia.org/wiki/Finite_state_machine) de votre système. – KarolDepka

+0

S'il vous plaît upvote la réponse (la flèche vers le haut) si vous le trouvez un peu utile. Merci. – KarolDepka

0

Jetez un oeil à JBoss Netty et gérer la communication entre les threads avec une implémentation Queue qui correspond à vos besoins.

Netty a une courbe d'apprentissage de direction, mais il est payant avec un design facile à maintenir et tant que vous n'avez pas besoin de transfert UDP (alors je jetterais un coup d'oeil à Apache Mina) c'est juste assez. De même, vous n'avez pas besoin d'implémenter une machine d'état avec Netty.