来自websocket的Golang bufio在第一次阅读后中断

我正在尝试从 websocket 流式传输 JSON 文本。但是,在初次阅读后,我注意到流似乎中断/断开连接。这是来自 Pleroma 服务器(想想:Mastodon)。我正在使用默认的 Golang websocket 库。


package main


import (

    "bufio"

    "fmt"

    "log"


    "golang.org/x/net/websocket"

)


func main() {

    origin := "https://poa.st/"

    url := "wss://poa.st/api/v1/streaming/?stream=public"


    ws, err := websocket.Dial(url, "", origin)

    if err != nil {

        log.Fatal(err)

    }


    s := bufio.NewScanner(ws)

    for s.Scan() {

        line := s.Text()

        fmt.Println(line)

    }

}

在初始 JSON 文本响应之后,for 循环中断。我希望它每隔几秒钟发送一条新消息。


这可能是什么原因造成的?如果我可以使用 Gorilla websocket 库,我愿意切换到bufio.


谢谢!


喵喔喔
浏览 172回答 1
1回答

饮歌长啸

尽管 x/net/websocket 连接具有与 io.Reader 中的 Read 方法具有相同签名的 Read 方法,但该连接不像 io.Reader 那样工作。使用 bufio.Scanner 包裹时,连接将无法正常工作。poa.st 端点发送消息流,其中每条消息都是一个 JSON 文档。使用以下代码使用Gorilla 包读取消息:url := "wss://poa.st/api/v1/streaming/?stream=public"ws, _, err := websocket.DefaultDialer.Dial(url, nil)if err != nil {    log.Fatal(err)}defer ws.Close()for {    _, p, err := ws.ReadMessage()    if err != nil {        log.Fatal(err)    }    // p is a []byte containing the JSON document.    fmt.Printf("%s\n", p)}Gorilla 包有一个用于解码 JSON 消息的辅助方法。这是一个如何使用该方法的示例。url := "wss://poa.st/api/v1/streaming/?stream=public"ws, _, err := websocket.DefaultDialer.Dial(url, nil)if err != nil {    log.Fatal(err)}defer ws.Close()for {    // The JSON documents are objects containing two fields,     // the event type and the payload. The payload is a JSON    // document itself.    var e struct {        Event   string        Payload string    }    err := ws.ReadJSON(&e)    if err != nil {        log.Fatal(err)    }    // TODO: decode e.Payload based on e.Event}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go