我正在研究java中的套接字。我创建了一个简单的tcp客户端,旨在发送HTTP请求并接收响应。但在运行客户端后,它只是等待,没有响应。这是我的代码:
public static void connect(){
try (
Socket socket = new Socket("localhost", 80);
PrintWriter writer
= new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader reader
= new BufferedReader(new InputStreamReader(socket.getInputStream()));
) {
socket.setSoTimeout(60000);
String request = "GET / HTTP/1.1\r\n" +
"Host: localhost\r\n" +
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" +
"Accept-Language: en-US,en;q=0.5\r\n";
writer.write(request);
writer.flush();
String line;
System.out.println("Response: ");
while((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
这是输出:
Response:
Read timed out
BUILD SUCCESSFUL (total time: 1 minute 0 seconds)
注意:
我知道为了这个目的,我可以在Java中使用更多抽象类,如url
类等。正如我所说,我正在研究套接字。
答案 0 :(得分:2)
要终止HTTP请求的请求部分,您需要发送两个换行符,而不只是一个。
String request = "GET / HTTP/1.1\r\n" +
"Host: localhost\r\n" +
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" +
"Accept-Language: en-US,en;q=0.5\r\n\r\n";
请注意字符串末尾的双 \r\n\r\n
。
如果您没有终止请求,另一端的HTTP服务器将坐在那里等待您终止请求,您的代码将等待永远不会到来的答案。