我在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”仅在卷曲中断后出现在控制台中。套接字接受来自远程客户端的请求时也会出现
答案 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。