首次读取后来自 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
}
我正在尝试从 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
.
谢谢!
虽然 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
}