java - 为什么从套接字流读取会永远阻塞?

标签 java sockets http

我正在尝试通过打开 TCP 套接字、发送请求并读取/打印响应消息来手动执行一些 HTTP。响应正文的内容打印良好,但主线程永远不会退出并永远阻塞。

socket = new Socket(host, port);
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.print(request);
writer.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
reader.lines().forEach(System.out::println);
// String next_record = null;
// while ((next_record = reader.readLine()) != null)
// System.out.println(next_record);

socket.close();
// System.out.println("Finished"); 

我缺少什么,如何修复它?

最佳答案

您确定正确发送 HTTP 请求吗?这对我有用。请注意“Connection: Close\r\n”字符串很重要,否则在阅读内容后它也会挂起。

import java.net.Socket;
import java.io.PrintWriter;
import java.io.*;

public class App {

    public static void main(String[] args) throws Exception {
        String host = "google.com";
        int port = 80;
        Socket socket = new Socket(host, port);

        //BufferedWriter writer = new BufferedWriter(
        //       new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
        PrintWriter writer = new PrintWriter(socket.getOutputStream());
        writer.write("GET / HTTP/1.1\r\n");
        writer.write("Connection: Close\r\n");
        writer.write("\r\n");
        writer.flush();

        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));

        // reader.lines().forEach(System.out.println);
        String line;
        System.out.println("Reading lines:");
        while ((line = reader.readLine()) != null) {
            System.out.println("* " + line);
        }
        System.out.println("DONE READING RESPONSE");

        reader.close();
        writer.close();
        // socket.close();

        System.out.println("Finished"); 
    }

}

关于java - 为什么从套接字流读取会永远阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22691665/

相关文章:

c - Linux UDP 接收 : What do I get at the start of my buffer?

http - HTTP GET 请求中是否需要 `Host`?

javascript - HTTP 请求负载中未定义的参数属性将被清除

java - JPA native 查询转换失败异常: Failed to convert from type

java - 如何将视频设置为全屏

java - 尝试与 Web 服务通信时遇到 "No route to host"错误

security - 如何区分我的客户端应用程序发送的 HTTP 请求和来自 Internet 的其他请求

java - 如何在JSP中设置下拉菜单的选择更改值

java - Primefaces 中是否有任何选取框效果行为......?

c - 调试套接字程序