golang的server push
- server push作用的理解
- 客户端和服务端建立连接之后,服务器主动将一些资源推送给服务端。
- 注意:推送的内容,要放在发送响应数据之前。
- server push示意图

- server push特点
- 理论上,缩短数据加载的时间
- 将请求数据存放在缓存中
- server push是http2的产物
- http2是强制性使用TLS(传送安全层)的,也就是https请求。因此为了完成代码,我们需要一个密钥(key)和一个证书(crt)。产生证书的方法。在Linux中运行以下命令(在当前路径下生成):
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt
package main
import(
"os"
"fmt"
"log"
"net/http"
"io/ioutil"
"encoding/base64"
)
var base64img string
var image []byte
func init(){
var err error
image,err = ioutil.ReadFile("./7775.jpg")
if err!=nil{
fmt.Println("初始化读取文件错误")
}
base64img = base64.StdEncoding.EncodeToString(image)
fmt.Println(base64img)
}
func main(){
fmt.Println("server push")
http.Handle("/",http.StripPrefix("/",http.FileServer(http.Dir("./"))))
http.HandleFunc("/serverPush",serverPush)
http.HandleFunc("/image",handleImage)
err:=http.ListenAndServeTLS(":8080","server.crt","server.key",nil)
if err!=nil{
log.Fatal(err)
}
}
func serverPush(w http.ResponseWriter,r *http.Request){
path,err:=os.Getwd()
if err!=nil{
panic(err)
}
fmt.Println("paht=",path)
pusher,ok := w.(http.Pusher)
fmt.Println("pusher:",pusher,ok)
if ok {
fmt.Println("支持serverPush")
if err:= pusher.Push("/image",nil);err!=nil{
log.Fatal("Failed to push:",err)
}
if err:= pusher.Push("/app.js",nil);err!=nil{
log.Fatal("Failed to push:",err)
}
if err:= pusher.Push("/style.css",nil);err!=nil{
log.Fatal("Failed to push:",err)
}
}
w.Header().Add("Content-Type","text/html")
fmt.Fprintf(w,`<html>
<head>
<title>Hello World</title>
<script src="/app.js"></script>
<link rel="stylesheet" href="/style.css"">
</head>
<body>
Hello, gopher!
<img src="/image">
</body>
</html>`)
}
func handleImage(w http.ResponseWriter,r *http.Request){
w.Header().Set("Content-Type","image/png")
w.Write(image)
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)