Java套接字只接受头

Java套接字只接受头,java,sockets,curl,Java,Sockets,Curl,我监听本地主机上的端口。我正在使用下一个代码: public static void main(String[] args) { listenPort(9000); } private static void listenPort(Integer portNumber) { try ( ServerSocket serverSocket = new ServerSocket(portNumber); ) { System.out.

我监听本地主机上的端口。我正在使用下一个代码:

public static void main(String[] args) {
    listenPort(9000);
}

private static void listenPort(Integer portNumber) {
    try (
            ServerSocket serverSocket = new ServerSocket(portNumber);
    ) {
        System.out.println("Port " + portNumber + " is listening");
        while (true) {
            Socket clientSocket = serverSocket.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println(inputLine);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
代码运行后,我使用curl执行post请求:

curl localhost:9000 -d foo
这是我的控制台输出:

POST / HTTP/1.1
Host: localhost:9000
User-Agent: curl/7.43.0
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded

Curl进程正在等待某些内容,请求主体“foo”仅在Curl中断后出现在控制台中。当套接字接受来自远程客户端的请求时也会发生同样的情况

CURL假设您的服务器是一个性能良好的HTTP服务器,因此它只是在等待响应,但您的服务器从未发送响应,这会导致CURL无限期地等待响应

没有显示“foo”一词,因为CURL发送以下数据(我添加了空格和数据部分):

readLine函数将简单地读取流,直到它看到“\n”,然后返回该值。但是CURL发送的数据的最后一行实际上不包含任何“\n”字符,而且由于套接字和流没有关闭,readLine()将只是阻塞,等待永远不会出现的“\n”字符

如果您通过退出CURL关闭连接,套接字也将关闭,这将关闭流,从而导致readLine()返回

为了解决这些问题,您可能不应该使用readLine()。此外,如果您想了解如何实现性能良好的HTTP服务器,还应该了解如何实现


否则,我建议使用已经存在的基于Java的HTTP服务器,如或只是普通的旧服务器。

Crul'默认协议是HTTP-请看一看,我想您的意思是
\r\n
(MS Windows行分隔符)?(并非相反)是的,当然。我编辑了答案。虽然在本例中,它实际上是HTTP强制使用的行分隔符,它独立于操作系统。
POST / HTTP/1.1\r\n
Host: localhost:9000\r\n
User-Agent: curl/7.43.0\r\n
Accept: */*\r\n
Content-Length: 3\r\n
Content-Type: application/x-www-form-urlencoded\r\n
\r\n
foo