2012-02-21 8 views
5

Tengo una aplicación cliente-servidor que estoy haciendo y estoy teniendo un poco de problemas al leer objetos en el servidor.ObjectInputStream - ¿Cómo esperar para obtener nuevos datos?

Después de que mi servidor se conecta a un socket de cliente, construyo flujos de entrada y salida de objetos y los paso junto con mi método service(). Allí, se supone que debo manejar diferentes tipos de mensajes del cliente. Puedo obtener un mensaje del cliente (es decir, un objeto Message, de mi diseño) bien. Pero, por supuesto, lo que quiero hacer es tener un bucle para poder recibir un mensaje, procesarlo y responder de nuevo.

Hasta ahora, mi código sólo funciona para un solo mensaje. Cuando agregué mi ciclo, lo que sucedió fue en cada iteración, mi servidor simplemente siguió leyendo el mismo mensaje una y otra vez antes de que mi cliente tuviera la oportunidad de enviar un nuevo mensaje por el socket (creo que esto es lo que está sucediendo, al menos) .

Así que lo que realmente necesita hacer es averiguar cómo hacer que mi service() método de espera para nueva entrada. ¿Algunas ideas? ¿O me estoy acercando a esto mal? ¿Necesito crear un OIS nuevo en cada iteración o ...? Algunos código:

public void service(ObjectInputStream input, ObjectOutputStream output) throws IOException, Exception { 

    _shouldService = true; 

    while (_shouldService) { 
        // It just keeps reading the same message over and over 
        // I need it to wait here until the client sends a new message 
        // Unless I'm just approaching this all wrong! 
     NetworkMessage message = (NetworkMessage) input.readObject(); 

     NetworkMessageHeader header = message.getHeader(); 

     String headerType = header.getType(); 

     if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeConnect)) { 
      doLoginForMessage(message, output); 
     } else if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeFiles)) { 
      doFilesList(message, output); 
     } else { 
      System.out.println("Unrecognized header type: " + headerType); 

     } 
    } 
} 

Respuesta

2

El ObjectOutputStream cachés de objetos y representaciones no detectarán si va a volver a enviar la misma instancia de una y otra vez desde el lado del cliente, pero con cambios en ella. Si este es su caso, debe llamar al reset en la transmisión antes de cada envío.

NetworkMessage message = new NetworkMessage(); 
for(;;) { 
    message.setProperty(whatever); 
    oos.reset(); 
    oos.writeObject(message); 
} 
+0

i tiene el mismo problema y un restablecimiento dio lo hacen ninguna diferencia – bubakazouba

+0

@bubakazouba Así que no era el mismo problema. – EJP

Cuestiones relacionadas