Cita:
Iniciado por MjRoxas ... Necesito llevar una lista de los conectados: he pensado en la clase DefaultListModel, pero no entiendo muy bien como esta clase mantiene informados al resto de los conectados mediando los metodos de fire..
¿Por qué no usas tu propia implementación? Esta implementación es bastante antigua, así que use un HashSet, pero actualmente podrías usar una implementación como LinkedList. Cada usuario es un JUser y es un Thread, e implementa una función para enviarle mensajes.
Código Java:
Ver originalpublic class JUser extends JObject implements JPingerListener, JConnectionHandler {
...
public void notice
(String message
) { socket.print(JMessage.message(JMessage.JM_NOTICE, nickname, message));
}
public void noticeWithMode
(String message,
char mode
) { if(modes.indexOf(mode) != -1)
notice(message);
}
...
}
La lista de usuarios, que es un HashSet de JUser se mantiene sincronizada y pasa por cada uno enviandole los mensajes correspondientes a uno y cada uno de los participantes, (cuando escribí esta aplicación no existía los Generics, pero puedes adaptar el método con Generics para no tener la necesidad de hacer el cast a JUser).
Código Java:
Ver originalpublic class JUsers extends JObject {
...
...
JUser user = new JUser(this, socket);
user.start();
users.add(user);
}
public synchronized void remove
(JUser user,
String message
) { users.remove(user);
}
...
public synchronized void fireNoticeAll
(String message
) { for(Iterator e
= users.
iterator(); e.
hasNext(); ) ((JUser)e.next()).notice(message);
}
public synchronized void fireNoticeAllWithMode
(String message,
char mode
) { for(Iterator e
= users.
iterator(); e.
hasNext(); ) ((JUser)e.next()).noticeWithMode(message, mode);
}
...
}
El servidor cuando necesita avisarle a todos solamente hace uso del método de la clase donde le avisa a todos los usuarios conectados,
Código Java:
Ver originalpublic class JServer extends JThread {
...
public JServer(int port) {
this.users = new JUsers(this);
}
...
...
if(!bannedConnection(socket, hostname, hostaddr))
...
}
}
...
...
if(banned) {
JSocket.print(socket, JMessage.message(JMessage.JM_KLINED, kl.reason));
users.fireNoticeAllWithMode(JMessage.message(JMessage.JM_KLINEDALL, hostname), 'K');
...
}
return banned;
}
}
De esa forma cuando el servidor quiere enviar un mensaje a todos los usuarios, o un usuario quiere enviar un mensaje a todos los demás usuarios, pasa por cada uno de los conectados y les envía el mensaje.
Cita:
Iniciado por MjRoxas ... Estoy en proceso de depuracion, y ahora mismo los problemas que tengo son con los avisos y mensajes del servidor a el/los clientes. ...
La programación en Java está orientada a objetos, aunque la aplicación que mostró endgel ha de ser funcional parece programación estructurada, como Pascal o C.
Para hacer este servidor y lograr que todos los componentes se comuniquen correctamente necesitas por lo menos 10 clases distintas, por ejemplo .. JServer, JSocket, JUser, JUsers, JConnection, JConnectionHandler, JChannel, JChannels, etc. Cada uno tiene una ocupación diferente y de esta forma logras dividir la funcionalidad de cada componente para que sea mas fácil de sincronizar al mismo tiempo de mantener la lógica simple.
Saludos,
ps:
El codigo fue escrito en el año 2002, así que evidentemente es muy antiguo, y eliminé muchas partes de control de errores, etc., pero es rápido y eficiente, en lo que cabe con cien usuarios conectados.