基于Netcat的简易Bash Web服务器在Chrome中不稳定如何修复?
修复基于Netcat的Bash简易Web服务器Chrome连接重置问题
问题分析
你的脚本核心问题是:Chrome会同时发起两个请求(页面内容和favicon.ico),而原脚本里nc -lp 80每次只能处理一个连接,处理完才会通过while循环重启nc。第二个请求到来时nc尚未完成重启,导致连接被重置,出现ERR_CONNECTION_RESET错误。即便加了-k选项,默认nc也是串行处理连接,依然无法响应并行请求。
可行修复方案
方案1:结合nc -k与后台子进程处理
通过nc -lk保持持续监听,同时将每个连接的响应逻辑放到后台子进程中,让主nc进程无需等待响应完成即可接受新连接:
#!/usr/bin/env bash # 预生成响应内容,包含正确的Content-Length HTML_CONTENT="<!DOCTYPE html><HTML><BODY>Test</BODY></HTML>" RESPONSE=$(cat <<-EOF HTTP/1.1 200 OK Content-Length: ${#HTML_CONTENT} Connection: close ${HTML_CONTENT} EOF ) # 持续监听80端口,每个连接触发后台响应 nc -lkp 80 | while read -r _; do # 后台输出响应,避免阻塞主监听进程 echo -e "$RESPONSE" & # 丢弃剩余的请求数据,防止影响下一次连接处理 cat > /dev/null done
方案2:后台循环快速重启nc
如果你的nc版本不支持-k选项,可以通过后台启动nc实例,配合短暂延迟确保端口能被快速重新监听:
#!/usr/bin/env bash HTML_CONTENT="<!DOCTYPE html><HTML><BODY>Test</BODY></HTML>" RESPONSE="HTTP/1.1 200 OK\nContent-Length: ${#HTML_CONTENT}\nConnection: close\n\n${HTML_CONTENT}\n\n" # 后台循环启动nc,确保端口始终有监听进程 while true; do (echo -en "$RESPONSE" | nc -lp 80) & # 短暂延迟避免端口占用冲突(根据nc版本调整) sleep 0.05 done
方案说明
- 方案1利用
nc -k保持监听,通过后台子进程处理响应,主进程立即回到监听状态,能同时处理Chrome的并行请求。cat > /dev/null用于清空请求缓冲区,防止未处理的请求数据干扰后续连接。 - 方案2通过后台启动nc实例,循环快速重启,确保端口不会出现无监听的空档期,让Chrome的第二个请求能被新启动的nc实例处理。
内容的提问来源于stack exchange,提问作者Maestro
相关产品推荐
相关产品推荐

