函数式编程
一种解决方案是使用 websocket,因为要建立连接,它使用一种特殊的标头,将浏览器和服务器之间所需的握手次数减少到只有一次,这意味着客户端服务器通信不会阻塞。此连接将在其整个生命周期内保持活动状态,您可以使用 JavaScript 从此连接写入或读取数据,就像在传统 TCP 套接字的情况下一样。作为实现问题,您可以将grab包组成的结果信息编码为json字符串,然后您可以使用 websocket.JSON.Send.func (cd Codec) Send(ws *Conn, v interface{}) (err error)在客户端,您可以获得组合的 json 对象,稍后您可以根据您的使用目的和首选技术(画布、DOM 等)解析和使用该对象。以下是 websocket服务器端的片段:package mainimport ( "fmt" "golang.org/x/net/websocket" "net/http")type FileInformation struct { BytesTransferred int Size string Filename string Progress int}func Echo(ws *websocket.Conn) { info := FileInformation{ BytesTransferred: 70, Size: "1.7MB", Filename: "test.txt", Progress: 60, } for { if err := websocket.JSON.Send(ws, info); err != nil { fmt.Println("Error sending message") break } // if BytesTransferred == 100 break }}func main() { http.Handle("/", websocket.Handler(Echo)) if err := http.ListenAndServe(":1234", nil); err != nil { fmt.Println("Cannot iniatiate a websocket connection") }}当然,这些值是硬编码的,如果您想改变传输速度,可以使用计时器滴答。该客户端写在走:package mainimport ( "fmt" "golang.org/x/net/websocket" "io" "os")func main() { type FileInformation struct { BytesTransferred int Size string Filename string Progress int } if len(os.Args) > 1 && (os.Args[1] == "--help" || os.Args[1] == "-h") { fmt.Println("Usage : " + os.Args[0] + " ws://localhost:port") os.Exit(1) } conn, err := websocket.Dial(os.Args[1], "", "http://127.0.0.1") checkError(err) var info FileInformation for { err := websocket.JSON.Receive(conn, &info) if err != nil { if err == io.EOF { break } fmt.Println("Couldn't receive msg " + err.Error()) break } fmt.Printf("%s", info) if err := websocket.JSON.Send(conn, info); err != nil { checkError(err) } }}func checkError(err error) { if err != nil { fmt.Println("Fatal error: " + err.Error()) os.Exit(1) }}在 javascript 中,您可以连接到 websocket 并以以下方式接收数据:<script type="text/javascript"> var sock = null; var wsuri = "ws://127.0.0.1:1234"; window.onload = function() { console.log("onload"); sock = new WebSocket(wsuri); sock.onopen = function() { console.log("connected to " + wsuri); } sock.onclose = function(e) { console.log("connection closed (" + e.code + ")"); } sock.onmessage = function(e) { console.log("message received: " + e.data); // deserialize json data var json = JSON.parse(e.data); } }; function send() { var msg = document.getElementById('message').value; sock.send(msg); };</script>