2016-12-09 3 views
0

나는 Go와 함께 학습 경험으로 간단한 Slackbot을 구축하고 있으며, 첫 번째 걸림돌을 맞았습니다. 연결에 메시지를 다시 쓸 수 없습니다!WebSocket WriteMessage 오류

여기 내 주요 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 &에서 "unexpected closure"라는 메시지를받습니다.

내 websocket 라이브러리에 Gorilla를 사용하고 있는데, 이는 "독자 한 명, 한 명의 작가"한도와 관련된 동시성 문제 일 수 있습니다. 몇 가지 시도해 보았지만 정직하게도 아직 디버깅에 대한 깊은 지식은 부족합니다. : -/

나는 여기에서 명백한 무엇인가 놓치고 있다고 확신한다! 내 봇이 다시 이야기 할 수 있도록 내 글쓴이를 관리하는 데 필요한 팁이 있습니까? 감사!

+1

이 예에서는 연결에 대한 동시 액세스가 없습니다. 동시성은 문제가 아닙니다. 확실하지 않으면 [경주 탐지기] (https://golang.org/doc/articles/race_detector.html)로 실행하십시오. 이 오류는 피어가 닫는 핸드 셰이크없이 연결을 닫았 음을 나타냅니다. 피어가 보낸 메시지가 마음에 들지 않았을 가능성이 있습니까? (나는 지금 느슨 함에 대해 아무것도 모른다). –

+1

Slack에 대해 궁금해서 API를 검색하여 메시지에 JSON을 사용하는지 확인합니다. 무작위 추측은 응용 프로그램이 유효하지 않은 JSON (문자열 'You talkin'to me?)을 보내서 Slack이 연결을 닫았다는 것입니다. –

+0

나는 경주 탐지기에 대해 몰랐다 - 나는 그것을 곧 점검하고 다시보고 할 것이다. 내 반응이 잘못되었을 가능성이 높습니다. 고려하지 않았습니다. 감사합니다! – Alex

답변

1

서버로 보낸 메시지가 서버에서 예상 한대로 JSON이 아닙니다. 서버가 핸드 셰이크없이 연결을 종료했습니다.