Pregunta

He empezado mirando HTTP, etc., y he escrito un simple cliente de Java que utiliza URLConnection para enviar una URL a un servidor y tira hacia abajo la página index.html (como texto sin formato).

Ahora estoy trabajando en un servidor simple, pero estoy atascado en el primer obstáculo, (bueno, tal vez 2º o 3º), no puedo conseguirlo para responder al cliente correctamente.

Esta es la lectura en bucle y se lee en la petición HTTP bien, incluso de FF y IE, etc:

while((message = in.readLine()) != null)
    {
        System.out.println(message);
        out.write("something");
    }

El problema es que no sé cómo conseguir que responda algo útil. Si dejo que haga lo que está haciendo en el código anterior se envía "algo" 6 veces a mi cliente (ya que hay 6 líneas a la petición HTTP), pero nada que FF / IE, etc.

Además, no parece romper el bucle nunca, ya que he añadido una línea System.out.println("test"); a imprimir después del bucle, pero el servidor nunca parece llegar a ese punto, se debe? En caso readLine () return null al final de la primera petición HTTP?

He estado leyendo cosas en los sitios web de Sun y Oracle, pero todavía estoy bastante atascado en cuanto a cómo debería funcionar.

Gracias por su tiempo,

Infinitifizz

Edit: Vaya, se olvidó de copiar el código en

.

Server.java:

package exercise2;

import java.net.*;

public class Server 
{
    public static void main(String[] args) throws Exception
    {
        boolean listening = true;
        ServerSocket server = new ServerSocket(8081);

    while(listening)
    {
        Socket client = server.accept();

        new ServerThread(client).start();
    }
        server.close();
    }
}

ServerThread.java:

package exercise2;

import java.io.*;
import java.net.*;

    public class ServerThread extends Thread 
{
    private Socket socket = null;
    public ServerThread(Socket s)
    {
        this.socket = s;
    }

    public void run()
    {
        try
        {

        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(
                                    socket.getInputStream()));

        String message, reply = "";

        while((message = in.readLine()) != null)
        {
            System.out.println(message);
            out.write("something");
        }
            System.out.println("test");
        in.close();
        out.close();
        socket.close();
        }
        catch(IOException e)
        {
            System.err.println("error");
        }
    }
}
¿Fue útil?

Solución

En primer lugar, cambiar la condición en el bucle while a
while(in.hasNextLine()) {
    message = in.nextLine();
    //etc....

En segundo lugar, no es necesario para salir del bucle while mientras se ejecuta el servidor. Usted debe hacer todo el análisis de las solicitudes dentro del bucle while, usando sentencias if para distinguir las solicitudes. La única vez que alguna vez salir del bucle while es cuando la conexión se cierre, de lo contrario, el método nextLine() bloqueará hasta que se reciba algo.

Otros consejos

Sin ver su código de cliente, este es mi mejor conjetura en cuanto a lo que está sucediendo:

Su servidor está bloqueando probablemente en ese readLine () porque el cliente se realiza por escrito la solicitud, pero no ha cerrado la conexión (como debería: el cliente debe esperar para obtener la respuesta sobre la misma conexión). Típicamente, un servidor HTTP analiza una solicitud ya que lo lee: basado en esta , se puede buscar "\ r \ n \ r \ n" para demarcar el final de la cabecera, y salir de su bucle de lectura en ese momento para analizar la solicitud y responder a ella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top