2016-12-09 62 views
0

我正在構建一個簡單的Slackbot作爲Go的學習體驗,並且我已經擊中了我的第一個障礙:我無法寫回消息給連接!WriteMessage上的Websocket失敗

這是我的主要FUNC:

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 &消息「意外關閉」。

我爲我的websocket庫使用大猩猩,我懷疑這可能是一個與他們的「一個讀者,一個作者」限制相關的併發問題。我已經嘗試了一些調整,但說實話只是不太瞭解languge/library還沒有深入調試。 : -/

我敢肯定我錯過了一些明顯的東西!管理我的作家讓我的機器人回話的任何提示?謝謝!

+1

本例中沒有對連接的併發訪問。併發不是問題。如果您不確定,請使用[race detector](https://golang.org/doc/articles/race_detector.html)運行。該錯誤表明對等關閉連接而沒有關閉握手。對方是否有可能不喜歡發送的消息? (我現在已經鬆懈了)。 –

+1

對Slack很好奇,我查了一下API,發現它使用JSON作爲消息。隨機猜測是Slack關閉了連接,因爲應用程序發送了無效的JSON(字符串「你對我說話?」)。 –

+0

我不知道比賽探測器 - 我馬上檢查一下並報告。很可能我的回覆是畸形的,我沒有考慮到這一點,謝謝! – Alex

回答

1

發送到服務器的消息不是服務器預期的JSON。服務器在沒有握手的情況下關閉了連接。

相關問題