第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

用于下載進(jìn)度的 Golang 和本地 Web 界面?

用于下載進(jìn)度的 Golang 和本地 Web 界面?

Go
縹緲止盈 2021-12-27 16:09:09
我是新手Go并試圖制作一個(gè)跨瀏覽器的應(yīng)用程序,它可以下載多個(gè)帶有進(jìn)度條的 url。該Grab包很好地完成了這項(xiàng)工作,如下面的示例所示。現(xiàn)在,我想要一個(gè)獨(dú)立的/可移植的/單一可執(zhí)行的 Web-UI,它可以在 Web 瀏覽器中顯示來(lái)自以下代碼的下載進(jìn)度?
查看完整描述

1 回答

?
函數(shù)式編程

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊

一種解決方案是使用 websocket,因?yàn)橐⑦B接,它使用一種特殊的標(biāo)頭,將瀏覽器和服務(wù)器之間所需的握手次數(shù)減少到只有一次,這意味著客戶端服務(wù)器通信不會(huì)阻塞。


此連接將在其整個(gè)生命周期內(nèi)保持活動(dòng)狀態(tài),您可以使用 JavaScript 從此連接寫入或讀取數(shù)據(jù),就像在傳統(tǒng) TCP 套接字的情況下一樣。


作為實(shí)現(xiàn)問(wèn)題,您可以將grab包組成的結(jié)果信息編碼為json字符串,然后您可以使用 websocket.JSON.Send.


func (cd Codec) Send(ws *Conn, v interface{}) (err error)

在客戶端,您可以獲得組合的 json 對(duì)象,稍后您可以根據(jù)您的使用目的和首選技術(shù)(畫布、DOM 等)解析和使用該對(duì)象。


以下是 websocket服務(wù)器端的片段:


package main


import (

    "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")

    }

}

當(dāng)然,這些值是硬編碼的,如果您想改變傳輸速度,可以使用計(jì)時(shí)器滴答。


該客戶端寫在走:


package main


import (

    "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 并以以下方式接收數(shù)據(jù):


<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>


查看完整回答
反對(duì) 回復(fù) 2021-12-27
  • 1 回答
  • 0 關(guān)注
  • 179 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)