Mi equipo está construyendo un servidor HTTP básico desde cero en Java, pero nuestros subprocesos de lectura se bloquean una vez que se quedan sin texto de solicitud para leer desde el flujo de entrada del socket. Una serie de puntos exclusivos de nuestra situación que no coinciden con las preguntas formuladas anteriormente :
El código básico:
public void readSocket() { receivedTime = System.currentTimeMillis(); requestFile = new File("recovery/" + receivedTime + ".txt"); try( FileWriter fw = new FileWriter(requestFile); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter out = new BufferedWriter(fw); ) { String line; while((line = in.readLine()) != null){ //TODO: this is where it blocks after reading past the last line of the request. out.write(line); } } catch (IOException e) { e.printStackTrace(); } }readLine() devuelve null solo si "se ha alcanzado el final de la secuencia", es decir, la otra parte ha cerrado el socket. Cuando readLine() lee un salto de línea sin datos anteriores, devuelve una String no nula que tiene una length de 0. Por lo tanto, debe corregir el ciclo while en consecuencia:
public void readSocket() { receivedTime = System.currentTimeMillis(); requestFile = new File("recovery/" + receivedTime + ".txt"); try( FileWriter fw = new FileWriter(requestFile); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter out = new BufferedWriter(fw); ) { String line; // read request headers... do { line = in.readLine(); if (line == null) return; // socket closed out.write(line); out.NewLine(); out.flush(); if (line.isEmpty()) break; // end of headers reached // process line as needed... } while (true); // check received headers for presence of a message // body, and read it if needed. Refer to RFC 2616 // Section 4.4 for details... // process request as needed... } catch (IOException e) { e.printStackTrace(); } }Ver también:
Mientras lee desde el socket, ¿cómo detectar cuándo el cliente ha terminado de enviar la solicitud?