Domanda

Ho appena iniziato a guardare HTTP ecc e ho scritto un semplice Java client che utilizza URLConnection per inviare un URL a un server e tira in basso nella pagina index.html (come testo normale).

Ora sto lavorando su un server semplice, ma mi sono bloccato al primo ostacolo, (beh, forse 2 o 3), non posso farlo per rispondere al cliente in modo corretto.

Questa è la lettura in loop e si legge nella richiesta HTTP bene, anche da FF e IE etc:

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

Il problema è che non so come farlo rispondere qualcosa di utile. Se lascio fare quello che sta facendo nel codice sopra invia "qualcosa" 6 volte al mio cliente (come ci sono 6 linee per la richiesta HTTP), ma niente a che FF / IE etc.

Inoltre, non sembra per rompere il ciclo mai come ho aggiunto una linea System.out.println("test"); per stampare dopo il ciclo ma il server non sembra mai raggiungere quel punto, dovrebbe? Qualora readLine () return null alla fine della prima richiesta HTTP?

Ho letto cose sui Sun e Oracle siti web, ma sto ancora piuttosto bloccato su come questo dovrebbe funzionare.

Grazie per il vostro tempo,

Infinitifizz

EDIT: Oops, dimenticato di copiare il codice in

.

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");
        }
    }
}
È stato utile?

Soluzione

Prima di tutto, cambiare la condizione nel ciclo while a
while(in.hasNextLine()) {
    message = in.nextLine();
    //etc....

In secondo luogo, non è necessario uscire dal ciclo while durante l'esecuzione di un server. Si dovrebbe fare tutto il parsing per le richieste all'interno del ciclo while, utilizzando se le dichiarazioni di distinguere le richieste. L'unica volta che si sarebbe mai uscire dal ciclo while è quando la connessione dovrebbe chiudere, in caso contrario, il metodo nextLine() bloccherà fino a quando viene ricevuto qualcosa.

Altri suggerimenti

Senza vedere il codice cliente, questo è il mio migliore ipotesi su ciò che sta succedendo:

Il server è probabilmente bloccando in quel readLine () perché il client è fatto scrivere la richiesta, ma non ha chiuso la connessione (come dovrebbe: il cliente deve aspettare per ottenere la risposta su quella stessa connessione). In genere, un server HTTP analizza una richiesta come si legge: sulla base di questo , si può cercare "\ r \ n \ r \ n" per delimitare la fine della testata, e uscire del vostro ciclo di lettura a quel punto per analizzare la richiesta e rispondere ad esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top