Arquitectura de servicio: inputStream está perdiendo bytes
Frecuentes
Visto 874 veces
0
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!
2 Respuestas
1
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
0
¡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 java inputstream outputstream or haz tu propia pregunta.
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 cabezaDebe 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