1 回答

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>
- 1 回答
- 0 關(guān)注
- 179 瀏覽
添加回答
舉報(bào)