zoukankan      html  css  js  c++  java
  • golang的server push

    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("./"))))  //建立静态文件服务器(当前文件夹下有,app.js、style.css、7775.jpg文件)
    	http.HandleFunc("/serverPush",serverPush)
    	http.HandleFunc("/image",handleImage)
    	err:=http.ListenAndServeTLS(":8080","server.crt","server.key",nil)  //使用tls的方式监听端口,这里是访问是使用https进行访问
    	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)   //使用断言的方法,判断时候只是server push。
    	fmt.Println("pusher:",pusher,ok)
    	if ok {
    		fmt.Println("支持serverPush")
    		// push函数:可以发送文件、api接口
    		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)
    }
    

  • 相关阅读:
    2018-2019-2 20165232 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
    2018-2019 20165232 Exp5 MSF基础应用
    2018-2019-2 网络对抗技术 20165232 Exp4 恶意代码分析
    2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践
    2018-2019-2 网络对抗技术 20165232 Exp2 后门原理与实践
    2018-2019-2 20165232《网络对抗技术》Exp1 缓冲区溢出实验
    20165232 week1 kali安装
    2018-2019-2 20165205 网络对抗技术 Exp9 Web安全基础
    2018-2019-2 网络对抗技术 20165205 Exp8 Web基础
    2018-2019-2 20165205 网络对抗技术 Exp7 网络欺诈防范
  • 原文地址:https://www.cnblogs.com/MyUniverse/p/11618897.html
Copyright © 2011-2022 走看看