Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

288
Visualizações
Java, HTTP y sockets: ¿cuándo dejar de leer la solicitud pero mantener el socket abierto?

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 :

  • Queremos mantener el socket abierto mientras procesamos la solicitud y generamos una respuesta para devolverla.
  • No analizamos los datos al principio, sino que primero los leemos del zócalo y metemos todo en un archivo de recuperación. Luego comenzamos a analizar y validar desde el archivo, para asegurarnos de no perder la solicitud en caso de desastre.

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(); } }
over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

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?

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda