Je fais actuellement un Bot IRC en Java (je sais, il existe des cadres) et j'essaie de le faire connecter à plusieurs serveurs. Le problème que je suis avec ce n'est pas la partie de connexion, je suis en train d'exécuter ma classe de connexion en x quantité de threads. Chaque thread reliera le bot au serveur / port spécifié. Maintenant, mon problème est que lorsque certains textes sont émis par un utilisateur, le bot est censé envoyer un message le canal disant "Vous avez saisi cette commande" (pour un exemple). Maintenant, je voudrais que le bot soit envoyé à tous les serveurs qui disent "vous avez tapé cette commande". Ceci est simplement juste un exemple (c'est pourquoi cela n'a pas beaucoup de sens).
if (lineReader.substring(lineReader.indexOf(":"), lineReader.length()).equals("hello")) {
message both servers "Hello World!"
}
6 Réponses :
La solution la plus simple consiste à transmettre un objet commun aux deux threads. Dans ce cas, il pourrait simplement être une chaîne code> code>. Par exemple: Votre autre exemple devient alors devient: p> if (lineReader.substring(lineReader.indexOf(":"), lineReader.length()).equals("hello")){
messagePasser = "Hello, World!";
}
Ainsi, alors vous dites que lors de l'écoute de certaines commandes du serveur, je devrais également écouter voir si le VAR change de la version perméable et si elle le ferait alors sauter les deux serveurs. J'aime cette idée, mais cela me demanderait d'avoir un certain temps à l'intérieur d'un moment et je ne suis pas sûr de la fiabilité.
Je pense qu'une approche simple serait un modèle d'observateur où chaque fil sait à propos de tous les autres threads p>
La solution MessagePasser ne fonctionnera pas car les objets de chaîne en Java sont passés par la valeur, pas par référence. P>
Bonne observation mais veuillez en faire un commentaire à cette réponse, puis supprimez ceci. Merci et bienvenue à tellement!
J'ai essayé mais je ne pouvais pas savoir comment. Après avoir lu la FAQ, j'ai réalisé que j'ai besoin d'au moins 50 points de réputation pour laisser des commentaires sur des postes qui n'ont pas été créés par moi.
de votre description, je prends que chacun des threads attend un message d'un autre utilisateur sur le chat. En attente signifie qu'il appelle une méthode réseau qui ne renvoie que lorsqu'un message arrive. Dès que ce message arrive, le fil (éventuellement) génère une réponse, la publie puis continue d'attendre. C'est pourquoi vous avez plusieurs threads, non? P>
Cela signifie toutefois que les threads ne peuvent envoyer que quelque chose après avoir reçu quelque chose. Parce que seulement ils sont réveillés de leur état d'attente. Cela signifie qu'il n'est pas difficile de "diffuser" la réponse de la commande à tous les threads. Au lieu de cela, le fil de réception doit l'envoyer à tous les serveurs (tandis que les autres threads attendent toujours de lire ces serveurs). P>
En d'autres termes: rompre l'affectation stricte des serveurs aux fils. Laissez n'importe quel fil d'envoi à n'importe quel serveur. P>
Voir que je pensais faire ça, mais ça rend mon code pas flexible ... du tout, et cela me fait peur lol. J'aime trop le code flexible: x.
Ajoutez chaque fil à une collection, disons la liste et surveillez les mises à jour. Dès qu'une mise à jour est disponible, envoyez-la à chaque fil. (Cela ressemble à un observateur ...)! P>
Vous devez donner à chaque fil une file d'attente de messages entrants que d'autres threads peuvent pousser de manière asynchrone; Java.Util.ConCurrent.ConCurrentLinkedQueue serait probablement une bonne classe à utiliser pour cela. P>
Vous aurez alors besoin d'une instance de classe de messagerie unique qui a des références à tous vos discussions. Si un thread veut envoyer un message à tous les autres threads, cela appellerait Envoyer (MSG) sur cet objet Messageender global, et il ira à son tour surtout sur toutes les threads et appuyez sur le message à leurs files d'attente respectives (sauter le fil de la expéditeur). p>
Les threads eux-mêmes peuvent ensuite vérifier leur propre file d'attente de temps en temps (selon toute autre logique, elles peuvent être exécutées également) et supprimer des messages une fois qu'ils les ont manipulées. P>
Au début, j'habitais à cette approche, mais c'est certainement le plus simple / le plus efficace à mettre en œuvre. Merci: D