Java套接字仅接受标头

时间:2016-01-19 14:47:12

标签: java sockets curl

我在localhost上监听端口。我正在使用下一个代码:

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

卷曲过程正在等待某些事情并且请求主体“foo”仅在卷曲中断后出现在控制台中。套接字接受来自远程客户端的请求时也会出现

1 个答案:

答案 0 :(得分:3)

CURL假设您的服务器是一个表现良好的HTTP服务器,所以它只是在等待响应,但是您的服务器从不发送一个,这会导致CURL无限期地等待它。

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

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

readLine函数只会读取流,直到它看到" \ n"然后它将返回。但是,CURL发送的数据的最后一行实际上并不包含任何" \ n"字符串,由于套接字和流未关闭,readLine()将只是阻塞,等待" \ n"永远不会来的角色。

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

为了解决这些问题,您可能不应该使用readLine()。如果你想学习如何实现一个行为良好的HTTP服务器,你应该阅读HTTP works on Wikipedia的方法。

否则我建议使用现有的基于Java的HTTP服务器,如Jetty或仅使用普通的Java Servlets