You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:谷歌浏览器无法接收Java服务器应用发送的纯文本

解决Java服务器向Chrome发送纯文本无响应的问题

嘿,我明白你遇到的问题了——Chrome没法收到你Java服务器发的纯文本,核心原因是浏览器作为HTTP客户端,严格遵循HTTP协议规范,它不会接收不符合格式的响应。你现在的代码只是直接往Socket里写纯文本,但浏览器在等一个完整的HTTP响应,所以会一直卡着或者直接忽略内容。

咱们来修正一下代码,让它符合HTTP协议要求:

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Server {
    private int portNumber;

    public Server(int portNumber) {
        this.portNumber = portNumber;
    }

    public void start() {
        final ExecutorService threadPool = Executors.newFixedThreadPool(10);
        Runnable serverTask = () -> {
            try (ServerSocket ss = new ServerSocket(portNumber)) {
                System.out.println("服务器已启动,监听端口:" + portNumber);
                while (true) {
                    Socket clientSocket = ss.accept();
                    threadPool.submit(() -> handleClient(clientSocket));
                }
            } catch (IOException e) {
                System.err.println("服务器启动失败:" + e.getMessage());
            }
        };
        new Thread(serverTask).start();
    }

    private void handleClient(Socket clientSocket) {
        try (OutputStream out = clientSocket.getOutputStream()) {
            // 第一步:发送符合HTTP规范的响应头
            // 状态行+必要的响应头,最后用空行分隔头和内容
            String responseHeader = "HTTP/1.1 200 OK\r\n" +
                    "Content-Type: text/plain; charset=UTF-8\r\n" +
                    "Content-Length: 13\r\n" + // 要和下面内容的字节数匹配("Hello, Chrome!"是13字节)
                    "\r\n";
            out.write(responseHeader.getBytes("UTF-8"));

            // 第二步:发送你的纯文本内容
            String plainTextContent = "Hello, Chrome!";
            out.write(plainTextContent.getBytes("UTF-8"));
            
            // 强制刷新输出流,确保所有内容都发送到客户端
            out.flush();
        } catch (IOException e) {
            System.err.println("处理客户端请求出错:" + e.getMessage());
        } finally {
            // 处理完请求后关闭Socket,释放资源
            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new Server(8080).start();
    }
}

关键知识点说明:

  • 必须有HTTP状态行:HTTP/1.1 200 OK是告诉浏览器“请求成功”的标准状态行,没有这个浏览器不知道怎么处理后续内容
  • Content-Type头不能少:text/plain; charset=UTF-8明确告诉浏览器这是纯文本,并且用UTF-8编码,避免乱码
  • Content-Length(推荐):指定响应内容的字节数,让浏览器知道什么时候接收完所有数据,不用一直等待
  • 头和内容的分隔空行:\r\n\r\n是HTTP协议强制要求的,用来区分响应头和响应体
  • flush输出流:Java的输出流会有缓冲区,调用flush()能确保所有字节立刻发送到客户端

之前你直接发纯文本,浏览器会因为没收到合法的HTTP响应而一直处于等待状态,直到超时,所以看起来像是“无法接收”。按照上面的代码修改后,Chrome就能正常显示你发送的纯文本了。

内容的提问来源于stack exchange,提问作者Fogarasi Norbert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:34:57