Ошибка Websocket при WriteMessage

Я создаю простой 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, чтобы мой бот отвечал? Спасибо!


person Alex    schedule 09.12.2016    source источник
comment
В этом примере нет одновременного доступа к соединению. Проблема не в параллелизме. Если вы не уверены, запустите детектор гонки. Ошибка указывает на то, что одноранговый узел закрыл соединение без закрывающего рукопожатия. Возможно ли, что партнеру не понравилось отправленное сообщение? (Я сейчас ничего не знаю о слабине).   -  person Cerise Limón    schedule 10.12.2016
comment
Заинтересовавшись Slack, я просмотрел API и увидел, что он использует JSON для сообщений. Случайное предположение состоит в том, что Slack закрыл соединение, потому что приложение отправило недопустимый JSON (строка You talkin' to me?).   -  person Cerise Limón    schedule 10.12.2016
comment
Я не знал о детекторе гонок - скоро проверю и доложу. Очень возможно, что мой ответ искажен, я не учел этого. Спасибо!   -  person Alex    schedule 10.12.2016
comment
@MellowMarmot Это просто проблема неправильного ответа! : facepalm: Я люблю простые решения, но поймать их всегда неловко. Не могли бы вы ответить, чтобы я мог согласиться и получить те милые интернет-очки, которых вы заслуживаете? Большое спасибо за Вашу помощь!   -  person Alex    schedule 10.12.2016


Ответы (1)


Сообщение, отправленное на сервер, не является JSON, как ожидал сервер. Сервер закрыл соединение без подтверждения.

person Cerise Limón    schedule 10.12.2016