首次读取后来自 websocket 的 Golang bufio 中断

Golang bufio from websocket breaking after first read

我正在尝试从 websocket 流式传输 JSON 文本。然而,在初步阅读之后,我注意到流似乎 break/disconnect。这是来自 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 循环中断。我希望它每隔几秒发送一条新消息。

这可能是什么原因造成的?如果可以与 bufio.

一起使用,我愿意切换到 Gorilla websocket 库

谢谢!

虽然 x/net/websocket 连接有一个 Read 方法,其签名与 io.Reader 中的 Read 方法相同,但连接不像 io.Reader 那样工作。当用 bufio.Scanner.

包裹时,连接将无法正常工作

poa.st 端点发送消息流,其中每条消息都是一个 JSON 文档。使用以下代码使用 Gorilla package:

读取消息
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
}