带PrintWriter的简单Java服务器 - 向浏览器发送响应时出现问题

时间:2010-10-20 16:12:45

标签: java http webserver java-server

我刚刚开始查看HTTP等,并编写了一个简单的Java客户端,它使用URLConnection将URL发送到服务器并下拉index.html页面(作为纯文本)。

现在我正在开发一个简单的服务器,但是我遇到了第一个障碍,(好吧可能是第二或第三个),我无法让它正确响应客户端。

这是循环读取,它读取HTTP请求很好,甚至从FF和IE等:

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

问题在于我不知道如何让它回应任何有用的东西。如果我让它在上面的代码中执行它所做的事情,它会向我的客户端发送6次“某事”(因为HTTP请求有6行),但没有给FF / IE等。

此外,它似乎没有打破循环,因为我在循环后添加了System.out.println("test");行进行打印,但服务器似乎永远不会达到这一点,是吗? readLine()应该在第一个HTTP请求结束时返回null吗?

我一直在阅读太阳和甲骨文网站上的内容,但我仍然非常担心这应该如何运作。

感谢您的时间,

Infinitifizz

编辑:哎呀,忘了复制代码。

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");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果没有看到您的客户端代码,我最好猜测发生了什么:

您的服务器可能在该readLine()中阻塞,因为客户端已完成写入请求,但尚未关闭连接(因为它应该:客户端应该等待以通过同一连接获得响应)。通常,HTTP服务器在读取请求时会对其进行解析:基于this,您可以查找“\ r \ n \ r \ n”来划分标题的末尾,并中断读取循环在那时解析请求并回复它。

答案 1 :(得分:0)

首先,将while循环中的条件更改为
while(in.hasNextLine()) {
    message = in.nextLine();
    //etc....

其次,在运行服务器时,您不需要退出while循环。您应该对while循环内的请求进行所有解析,使用if语句来区分请求。退出while循环的唯一时间是连接应该关闭,否则,nextLine()方法将阻塞,直到收到某些内容。