Question

Je viens juste de commencer regarder HTTP, etc., et ai écrit d'un simple client Java qui utilise URLConnection pour envoyer une URL à un serveur et tire vers le bas la page index.html (sous forme de texte).

Maintenant, je travaille sur un simple serveur, mais je suis coincé au premier obstacle, (peut-être bien 2ème ou 3ème), je ne peux pas à répondre au client correctement.

Voici la lecture en boucle et il lit dans l'amende de requête HTTP, même de FF et IE etc:

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

Le problème est que je ne sais pas comment l'obtenir pour répondre quoi que ce soit utile. Si je laisse faire ce qu'il fait dans le code ci-dessus, il envoie 6 fois « quelque chose » à mon client (comme il y a 6 lignes à la requête HTTP) mais rien à FF / IE etc.

, il ne semble pas aussi de briser la boucle jamais comme je l'ai ajouté une ligne de System.out.println("test"); pour imprimer après la boucle, mais le serveur ne semble jamais atteindre ce point, devrait-il? readLine doit () null de retour à la fin de la première requête HTTP?

J'ai lu des choses sur les sites de soleil et oracle, mais je suis encore assez coincé à la façon dont cela devrait fonctionner.

Merci pour votre temps,

Infinitifizz

EDIT: Oops, a oublié de copier le code dans

.

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");
        }
    }
}
Était-ce utile?

La solution

Tout d'abord, changer la condition dans la boucle while à
while(in.hasNextLine()) {
    message = in.nextLine();
    //etc....

Deuxièmement, vous n'avez pas besoin de sortir de la boucle while lors de l'exécution d'un serveur. Vous devez faire tout l'analyse syntaxique des requêtes à l'intérieur de la boucle while, en utilisant si les déclarations de distinguer les demandes. Le seul moment où vous jamais sortir de la boucle while est lorsque la connexion doit se fermer, sinon, la méthode nextLine() bloquera jusqu'à ce que quelque chose soit reçu.

Autres conseils

Sans voir votre code client, c'est ma meilleure estimation à ce qui se passe:

Votre serveur bloque probablement dans cette readLine () parce que le client se fait par écrit la demande, mais n'a pas fermé la connexion (comme il devrait: le client doit attendre pour obtenir la réponse sur cette même connexion). En règle générale, un serveur HTTP parse une requête comme il le lit: basé sur ce , vous pouvez rechercher « \ r \ n \ r \ n » pour délimiter la fin de l'en-tête, et de sortir de la boucle de lecture à ce point pour analyser la demande et y répondre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top