Arquitectura de servicio: inputStream está perdiendo bytes

tengo una especie de arquitectura de servicio en mi servidor, escuchando en un sock de TCP-IP.

messageType = protocolHandler.getMessageType();
ITaskProtocol serviceProtocol = serverServices.get(messageType);
if (p != null) {
    String result = serviceProtocol.handleTask(protocolHandler);
}

Estoy almacenando un protocolo para una tarea específica en un mapa hash. Mi problema es que el protocolo que debería manejar la tarea no encuentra ningún byte en el flujo de entrada. inputStream y socked están dentro del "protocolHandler".

ejemplo:

public class ProtocolHandler implements ITaskProtocolHandler {
    @Override
    public int getMessageType() throws IOException {
        return new DataInputStream(stream).readInt();
    }

Sin embargo, puedo ver (debido a la depuración) que se envió el mensaje. y también se encontró el protocolo (servicio) en el mapa y se invocó el método "handleTask (...)" del servicio. Sin embargo, el servicio no recibe ningún mensaje porque los bytes se pierden y los protocolos se esperan el uno al otro.

Supongo que la búsqueda del servicio necesita demasiado tiempo y el mensaje se pierde mientras tanto.

Información importante: A veces funciona, a veces no. el cliente y el servidor se ejecutan en la misma PC, probablemente sea un problema de subprocesos.

protocolo del cliente:

clientWorker.send(ServerProtocol.MessageRequestType.JoinTopicRequest.getRequestNumber());
clientWorker.send("some xml-message");

protocolo de servicio del servidor:

public String handleTask(ITaskProtocolHandler protocolHandler) throws Exception {
    Message m = protocolHandler.getMessage());

¿Qué está mal en la arquitectura?

¡muchas gracias!

preguntado el 03 de mayo de 12 a las 16:05

2 Respuestas

Esta es una suposición descabellada, pero podría ser su problema. ¿Tu hilo está bloqueado y esperando datos?

Si es así, debe corregir el orden en el que está solicitando los flujos en su socket, debe obtener PRIMERO el inputStream del socket y luego solicitar el outputStream, de lo contrario, terminará en un hilo bloqueado y esperando datos.

Espero que esto resuelva tu problema.

Consulte esta publicación: Pregunta sobre el socket java de Stackoverflow para una explicación completa.

contestado el 23 de mayo de 17 a las 13:05

hay hilos demasiado importantes. uno es el cliente y otro el servidor. cada uno está bloqueando si espera datos. los flujos se almacenan así en el servidor public ProtocolHandler(Socket socket) throws IOException { this.socket = socket; this.outputStream = socket.getOutputStream(); this.inputStream = socket.getInputStream(); } - crece la cabeza

Debe hacer coincidir los pedidos como se explica en el enlace que agregué, buena suerte con eso :) - Juan Alberto López Cavallotti

el orden es correcto! encontré el problema! era un problema de lectura :( - crece la cabeza


¡problema resuelto! tuve un problema de lectura... "totalRead += nRead;" Estaba faltando....

    int size = readInt();
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();

    int nRead = 0;
    int totalRead = 0;
    byte[] data = new byte[1024];

    while (totalRead < size) {
        int read;
        if (data.length <= (size - totalRead))
            read = data.length;
        else
            read = (size - totalRead);
        if ((nRead = inputStream.read(data, 0, read)) == -1)
            throw new IOException("End of stream");
        buffer.write(data, 0, nRead);
        totalRead += nRead;
    }

Respondido el 18 de junio de 12 a las 11:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.