【问题标题】:Websocket Failure on WriteMessageWriteMessage 上的 Websocket 失败
【发布时间】:2016-12-10 08:42:43
【问题描述】:

我正在构建一个简单的 Slackbot 作为 Go 学习体验,但我遇到了第一个问题:我无法将消息写回连接!

这是我的主要功能:

func main() {
  conn, botId, err := slackInit(os.Getenv("SLACKBOT_TOKEN"))
  if err != nil { return }

  defer conn.Close()
  for {
    _, event, err := conn.ReadMessage()
    if err != nil {
      fmt.Println("Error processing message:", err)
      return
    }

    fmt.Println(string(event))

    message, err := slackGetMessage(event)
    if strings.Contains(message, botId) {
      fmt.Println("Bot was mentioned!")
      resp := []byte("You talkin' to me?")
      err = conn.WriteMessage(1, resp)
      if err != nil {
        fmt.Println("Error writing message:", string(resp))
        return
      }
    }
  }
}

这会毫无问题地侦听和报告事件,但一旦调用 conn.WriteMessage 方法就会失败。我收到来自websocket 的致命错误,代码为 1006 和消息“意外关闭”。

我将 Gorilla 用于我的 websocket 库,我怀疑这可能是与他们的“一个读者,一个作家”限制相关的并发问题。我已经尝试了一些调整,但老实说,只是对语言/库了解不够,还没有真正深入调试这个。 :-/

我确定我在这里遗漏了一些明显的东西!管理我的 Writer 以让我的机器人回话的任何提示?谢谢!

【问题讨论】:

  • 本例中没有并发访问连接。并发不是问题。如果您不确定,请使用 race detector 运行。该错误表明对等方在没有关闭握手的情况下关闭了连接。对等方是否可能不喜欢发送的消息? (我现在纠结于松弛)。
  • 对 Slack 感到好奇,我查看了 API,发现它使用 JSON 来发送消息。随机猜测是 Slack 关闭了连接,因为应用程序发送了无效的 JSON(字符串 You talkin' to me?)。
  • 我不知道比赛检测器 - 我会尽快检查并报告。很可能我的回复格式不正确,我没有考虑到这一点。谢谢!
  • @MellowMarmot 这只是一个格式错误的响应问题! :facepalm: 我喜欢简单的修复,但抓住它们总是很尴尬。您会放弃答案,以便我可以接受并为您提供您应得的那些甜蜜的互联网积分吗?非常感谢您的帮助!

标签: go websocket slack gorilla


【解决方案1】:

发送到服务器的消息不是服务器预期的 JSON。服务器没有握手就关闭了连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2020-03-12
    • 2018-12-19
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    相关资源
    最近更新 更多