Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con envío de notificaciones a sockets

Estas en el tema de Problema con envío de notificaciones a sockets en el foro de Java en Foros del Web. Estoy realizando el código de un Servidor de Noticias, en ese Servidor, he de notificar a todos aquellos que estén registrados en un canal, que ...
  #1 (permalink)  
Antiguo 17/07/2012, 06:41
Avatar de RsG
RsG
 
Fecha de Ingreso: febrero-2008
Mensajes: 16
Antigüedad: 16 años, 2 meses
Puntos: 0
Problema con envío de notificaciones a sockets

Estoy realizando el código de un Servidor de Noticias, en ese Servidor, he de notificar a todos aquellos que estén registrados en un canal, que ha sido introducido un nuevo mensaje en el canal en el que está inscrito.

Para ello, después de realizar una inserción de un mensaje, tengo la siguiente función de notificar.

Cita:
public void NotificacionFinal(String opcion) throws IOException{

// De la cadena opción, tomo el nombre del canal en el que escribo
String PartesOp[]=opcion.split("-");
String buzon = PartesOp[1];

// Me hago una copia del buzón
Buzon copia;
copia = dat.DevuelveBuzon(buzon);

// ME HAGO UNA COPIA DE LOS LECTORES QUE ESTÁN REGISTRADOS EN ESE CANAL
Vector<String> copialectores = null;
copialectores = dat.DevuelveLectoresBuzon(copia);

// CREO UN VECTOR CON TODOS LOS USUARIOS REGISTRADOS EN EL SERVIDOR

Vector<Usuario> copiaregistrados = null;
copiaregistrados = dat.DevuelveUsuariosRegistradosServidor();

// Este bucle comentado, busca las coincidencias, el bucle está bien y detecta el número de notificaciones que tengo que realizar
/*
enviarAlCliente("Buscamos lectores registrados");
for (int i = 0; i < copiaregistrados.size(); i++){
for ( int j = 0; j < copialectores.size(); j++){
if ( copialectores.elementAt(j).compareTo(copiaregistra dos.elementAt(i).getNick().toString()) == 0)
enviarAlCliente("Una NOTIFICACION");
}
*/

// AQUÍ VIENE EL PROBLEMA

// CON EL MISMO BUCLE DE ANTES, SIGUE ENCONTRANDO EL NÚMERO DE NOTIFICACIONES CORRECTAS, PERO ESTÁ MANDANDO A TODOS LOS USUARIOS TANTAS CADENAS DE TEXTO COMO NOTIFICACIONES TENGO QUE HACER


for (int i = 0; i < copiaregistrados.size(); i++){
for ( int j = 0; j < copialectores.size(); j++){
String n1 = null;
Socket sock = null;
if ( copialectores.elementAt(j).compareTo(copiaregistra dos.elementAt(i).getNick().toString()) == 0)
n1 = copiaregistrados.elementAt(i).getNick();
sock = copiaregistrados.elementAt(i).getSocket();
PrintWriter notificador = new PrintWriter(sock.getOutputStream(),true);
notificador.println("NUEVOS MENSAJES EN LOS BUZONES");
}
}
Es decir, los bucles, saben correctamente cuántas notificaciones tienen que realizar, el problema, es que las realiza mal.

Por ejemplo.

Tengo registrados los usuarios A,B,C,D,E y F

Y en el Canal 1 tengo registrados como lectores a A y B.

En el momento que salta esta función tras añadir un mensaje al Canal 1, detecta perfectamente que hay que realizar DOS notificaciones. El problema, es que a A le llega que hay que hacer DOS notificaciones y como a A, a todos los usuarios registrados del servidor aunque no estén apuntados a ese canal.

¿Alguna idea de donde puede estar el problema?

Lo ideal seria que al usuario A solo le llegase su notificación, a el usuario B la suya, y el resto no tuviesen ninguna noticia sobre los cambios realizados en un canal en el que no están registrados.

Gracias

Un Saludo!
  #2 (permalink)  
Antiguo 17/07/2012, 21:04
Avatar de zero0097  
Fecha de Ingreso: abril-2010
Ubicación: México
Mensajes: 481
Antigüedad: 14 años
Puntos: 69
Respuesta: Problema con envío de notificaciones a sockets

Asi a ojo rápido te recomendaría que modules (o modularices??) más tu código a parte de ser mas legible y entendible, es menos propenso a este tipo de errores lógicos... Yo no he detectado falla en tu código ya que si la comparación resulta cierta y dices que funciona debe realizar solo la instrucción que le indicas...

Tu tienes:
copialectores.elementAt(j).compareTo(copiaregistra dos.elementAt(i).getNick().toString()) == 0

A la segunda le especificas que es una String pero a la primera no (Copialectores esta lleno de Strings?).... podrias cambiarlo a ver si hay un detalle por alli, tambien podrias intentar usar el equals, aun que si dices que funciona entonces no debiera pasar lo que dices....

En estos casos usar el DEBUG en un IDE resulta de muy buena ayuda, haces una ejecución paso a paso verificando que es lo que realmente sucede, pruebalo ya verás que encuentras la solución....
__________________
De nada, hay te encargo +1...
  #3 (permalink)  
Antiguo 18/07/2012, 05:53
 
Fecha de Ingreso: abril-2012
Ubicación: Canarias
Mensajes: 41
Antigüedad: 12 años
Puntos: 5
Respuesta: Problema con envío de notificaciones a sockets

Si te soy sincero, no sé si es que me acabo de despertar y aún no me entero muy bien o es que tu código es sucio y difícil de entender. En primer lugar, no está bien visto (al menos para mí) poner un for dentro de otro for porque eso lía mucho a la gente (comprobado). Y además, para algo están los métodos de las API's de Java. Es mucho más óptimo usar equals() que ==.

En cuanto a la aplicación en sí, yo te recomendaría que tuvieras una clase Manager, por así decirlo, que controlara lo que son los canales y los clientes. Y que crees un Map<String, Client> Para obtener fácilmente los clientes de dicho canal. Por tanto al querer obtener los clientes de algún canal sería tan fácil como decir Client[] Clientes = Manager.Clients.get("NOMBRECANAL"); donde el objeto Clientes es el Map.

No sé, es cuestión de gustos, pero yo creo que es mucho más fácil y bonito a la vista ya que yo me he lo he leído unas 4 veces y sigo sin entender muy bien tu código.

Saludos.

Etiquetas: sockets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:28.