0

我刚刚开始研究 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 吗?

我一直在阅读 sun 和 oracle 网站上的内容,但对于这应该如何工作仍然很困惑。

谢谢你的时间,

无限化

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

服务器.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();
    }
}

服务器线程.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");
        }
    }
}
4

2 回答 2

2

在没有看到您的客户端代码的情况下,这是我对正在发生的事情的最佳猜测:

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

于 2010-10-20T18:53:36.793 回答
0

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

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

于 2011-02-05T05:56:20.930 回答