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

为何jwebserver不响应终端手动发送的简单HTTP请求?

问题:Bash脚本无法向jwebserver发送HTTP请求,但浏览器可正常访问

场景复现

  • 用php -S localhost:8888启动服务器时,执行以下Bash脚本可正常获取响应:
    exec 3<> /dev/tcp/localhost/8888
    echo -e "GET /hello.html HTTP/1.1
    Host: localhost
    " >& 3
    cat <& 3
    
  • 换成jwebserver -b localhost -p 8888启动服务器后,上述脚本延迟后无输出,jwebserver也无请求接收提示。
  • 用sudo tcpdump -i any port 8888监测发现:
    • PHP服务器能接收完整请求并返回响应
    • jwebserver仅完成TCP握手,无后续请求处理
  • 浏览器访问localhost:8888/hello.html时,jwebserver可正常响应。

原因分析

核心问题是HTTP请求格式不符合规范:

  • HTTP/1.1协议要求,请求头结束后必须有两个连续的换行(即一个空行),用于分隔请求头和请求体(即使没有请求体)。
  • 你的Bash脚本中,echo -e输出的内容最后仅包含一个换行(Host: localhost后的换行),缺少第二个空行。
  • PHP内置服务器对非标准请求的兼容性更高,会自动补全或忽略这个格式问题;但jwebserver(Java内置的Web服务器,从Java 18引入)遵循更严格的HTTP规范,会一直等待请求结束的标记(第二个空行),导致脚本卡住,服务器也不会处理请求。
  • 浏览器发送的请求完全符合HTTP规范,会在请求头后自动添加两个换行,因此jwebserver能正常处理。

解决方法

修改Bash脚本,在Host: localhost后添加一个额外的换行,确保请求头结束后有一个空行:

exec 3<> /dev/tcp/localhost/8888
echo -e "GET /hello.html HTTP/1.1
Host: localhost

" >& 3
cat <& 3

内容的提问来源于stack exchange,提问作者Tasos Papastylianou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:09:50