2010-10-29 21 views
7

Actualmente estoy creando un bot de IRC en Java (lo sé, hay frameworks) y estoy tratando de conectarlo a varios servidores. El problema que tengo con esto no es la parte de conexión, solo estoy ejecutando mi clase Connect en x cantidad de subprocesos. Cada hilo conectará el bot al servidor/puerto especificado. Ahora mi problema es que cuando un usuario da salida a un texto determinado, se supone que el bot debe enviar un mensaje al canal diciendo "has escrito este comando" (por ejemplo). Ahora quisiera que el bot envíe mensajes a TODOS los servidores diciendo "escribiste este comando". Esto es simplemente un ejemplo (por eso no tiene mucho sentido).¿Cómo tener 2 hilos para hablar entre ellos?

Connect f = new Connect(irc.freenode.net, 6667); 
Thread ft = new Thread(f); 
ft.start(); 
Connect q = new Connect(irc.quakenet.org, 6667); 
Thread qt = new Thread(q); 
qt.start(); 

Ahora tiene el código de ejemplo anterior, me gustaría que un hilo para hablar a la otra cuando se escribe un texto determinado. Algo como:

if (lineReader.substring(lineReader.indexOf(":"), lineReader.length()).equals("hello")) { 
    message both servers "Hello World!" 
} 

Si alguien pudiera ayudar, lo agradecería mucho. ¡Gracias!

Respuesta

1

Debería darle a cada hilo una cola de mensajes entrantes a los que otros hilos pueden acceder de manera asincrónica; java.util.concurrent.ConcurrentLinkedQueue probablemente sería una buena clase para usar para eso.

Necesitará una única instancia de la clase MessageSender que tenga referencias a todos sus hilos. Si un hilo desea enviar un mensaje a todos los otros hilos, llamaría a send (msg) en este objeto Global MessageSender y, a su vez, repetirá sobre todos los hilos y empujará el mensaje a sus respectivas colas (omitiendo el hilo del remitente).

Los propios hilos pueden verificar su propia cola de vez en cuando (dependiendo de cualquier otra lógica que puedan estar ejecutando también) y eliminar los mensajes una vez que los hayan manejado.

+0

Al principio tenía dudas sobre este enfoque, pero definitivamente es el más fácil/más eficiente de implementar. Gracias: D – zamN

0

La solución más simple es pasar un objeto común a ambos hilos. En este caso, podría ser un String. Por ejemplo:

String messagePasser; 
Connect f = new Connect(irc.freenode.net, 6667, messagePasser); 
Thread ft = new Thread(f); 
ft.start(); 
Connect q = new Connect(irc.quakenet.org, 6667, messagePasser); 
Thread qt = new Thread(q); 
qt.start(); 

Su otro ejemplo a continuación, se convierte en:

if (lineReader.substring(lineReader.indexOf(":"), lineReader.length()).equals("hello")){ 
    messagePasser = "Hello, World!"; 
} 

Cada hilo entonces debe comprobar constantemente messagePasser para ver cuando cambia la salida y luego el mensaje. Esta es obviamente una sugerencia muy simple y evita por completo muchas preocupaciones sobre la sincronización y la seguridad del hilo.

EDIT: A la luz de enterarse de que String s se pasan por valor (aprender algo nuevo cada día ...), usted sólo tiene que crear un objeto simple MessagePasser que encapsula un String y cualquier otro dato que se quiere.

+0

Entonces, estás diciendo que mientras escucho ciertos comandos del servidor, también debería escuchar para ver si la var cambia de la versión anterior y si lo hace, la enviaré a ambos servidores. Me gusta esta idea, pero eso me exigiría tener un tiempo dentro de un tiempo y no estoy seguro de lo confiable que es. – zamN

0

La solución messagePasser no funcionará porque los objetos de cadena en Java se pasan por valor, no por referencia.

+1

Buena observación, pero por favor haga un comentario a esa respuesta y luego elimine esto. Gracias y bienvenidos a SO! –

+0

Lo intenté pero no pude averiguar cómo. Después de leer las preguntas frecuentes, me di cuenta de que necesito al menos 50 puntos de reputación para dejar comentarios en publicaciones que no fueron creadas por mí. –

0

De su descripción tomo que cada uno de los hilos está esperando un mensaje de algún otro usuario en el chat. Esperar significa que llama a algún método de red que solo regresa cuando llega un mensaje. Tan pronto como llega ese mensaje, el hilo (opcionalmente) genera una respuesta, la publica y luego continúa esperando. Por eso tienes múltiples hilos, ¿verdad?

Eso significa, sin embargo, que los hilos solo pueden enviar algo después de que recibieron algo. Porque solo entonces se despiertan de su estado de espera. Eso significa que no es posible "transmitir" la respuesta del comando a todos los hilos. En cambio, el hilo de recepción tiene que enviarlo a todos los servidores (mientras que los otros hilos todavía están esperando leer de estos servidores).

En otras palabras: desglosar la asignación estricta de servidores a hilos. Deje que cualquier hilo envíe a cualquier servidor.

+0

Mira, estaba pensando en hacer esto, pero solo hace que mi código no sea flexible ... en absoluto, y eso me asusta jajaja. Me gusta mucho el código flexible: x. – zamN

0

Agregue cada hilo a una colección, digamos enumere y mire para las actualizaciones. Tan pronto como haya una actualización disponible, envíela a cada hilo. (Suena como un observador ...)!

Cuestiones relacionadas