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

现在,我正在使用简单的服务器工作,但我陷入了第一个障碍(也许第二或第三个),我无法正确响应客户。

这是循环的读数,它在http请求中读取正常,即使在ff和ie等中也可以读取:

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

问题是我不知道如何使它响应任何有用的东西。如果我让它在上面的代码中执行它正在执行的操作,它将向我的客户发送6次“ Something”(因为HTTP请求有6行),但没有任何ff/ie等。

另外,当我添加一个 System.out.println("test"); 循环后要打印的行,但是服务器似乎从未达到这一点,应该吗?应该在第一个HTTP请求的末尾readline()返回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");
        }
    }
}
有帮助吗?

解决方案

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

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

其他提示

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

您的服务器可能会在该readline()中阻塞,因为客户端完成了编写请求,但尚未关闭该连接(如:客户应该等待以在同一连接上获得响应)。通常,HTTP服务器在读取它时解析请求:基于 这个, ,您可以查找“ r n r n”来划定标头的末端,并在此时脱离阅读循环以解析请求并响应它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top