简单的数据流服务端和客户端实现
网页客户端 :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>流式读取内容</title>
</head>
<body>
<p id="content">接收数据流流==></p>
</body>
<script>
async function getRes() {
const res = await fetch(`http://127.0.0.1:8080/test_stream`,{
method: "get",
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
let content=document.getElementById('content');
while(1) {
// 读取数据流的第一块数据,done表示数据流是否完成,value表示当前的数
const {done, value} = await reader.read();
if (done) {
console.log(`done?===>`, done);
break;
}
let text = decoder.decode(value);
// 打印文本内容
console.log(text, done);
content.innerHTML = content.innerHTML +text
}
}
function loopf() {
getRes(). catch((er)=>{
console.log('捕获错误:'+er);
loopf();
})
} ;
loopf();
</script>
</html>
服务端(GO):
package main
import (
"fmt"
"net/http"
"time"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.Match([]string{"POST", "GET"}, "/test_stream", func(c *gin.Context) {
w := c.Writer
header := w.Header()
header.Set("Content-Type", "text/html")
// header.Set("content-type", "text/json")
header.Set("charset", "utf-8")
header.Set("Access-Control-Allow-Origin", "*")
//header.Set("Access-Control-Allow-Headers", "*")
//header.Set("Access-Control-Allow-Methods", "*")
w.WriteHeader(http.StatusOK)
w.Write([]byte(`
<html>
<body>
`))
w.(http.Flusher).Flush()
// 这里对每次循环输出都进行Flush刷新输出
for i := 0; i < 20; i++ {
w.Write([]byte(fmt.Sprintf(`
<p>%d</p>
`, i)))
w.(http.Flusher).Flush()
time.Sleep(1 * time.Second)
}
w.Write([]byte(`
</body>
</html>
`))
w.(http.Flusher).Flush()
})
r.Run("127.0.0.1:8080") /*visit http://127.0.0.1:8080/test_stream */
}
浙公网安备 33010602011771号