所以,我试图构建一个websocket服务器。我遇到了这个有趣的bug,我不知道为什么它会发生。GO - 函数返回后代码停止执行
注:的评论在代码片段在那里只为这个职位。 阅读它们。
Ive得到了这样的功能:
func Join(ws *websocket.Conn) {
Log.Connection(ws)
enc := json.NewEncoder(ws)
dec := json.NewDecoder(ws)
var dJ g.DiscussionJoin
var disc g.Discussion
Log.Err(dec.Decode(&dJ), "dec.Decode")
ssD := g.FindDiscussionByID(dJ.DiscussionID)
ssDJ := dJ.Convert(ws)
g.DiscHandle <- &ssDJ
disc = ssD.Convert()
Log.Err(enc.Encode(disc), "enc.Encode")
Log.Activity("Discussion", "Joined", disc.DiscussionID.Subject)
fmt.Println("Listening") //This gets called
g.Listen(dec)
fmt.Println("Stoped Listening") //This DOESN'T get called [IT SHOULD]
ssDJ.SSDiscussion.Leave(ssDJ.SSUserID)
Log.Disconnection(ws)
}
功能那造成这是(在我看来)g.Listen(...):
func Listen(dec *json.Decoder) {
timeLastSent := time.Now().Second()
in := Message{}
for ((timeLastSent + ConnTimeout) % 60) != time.Now().Second() {
if err := dec.Decode(&in); err != nil {
continue
} else if in == Ping {
timeLastSent = time.Now().Second()
continue
}
timeLastSent = time.Now().Second()
Messages <- in
in = Message{}
}
fmt.Println("Client timed out!") //This gets called
return
}
伊夫尝试都与不返回的最后一行听取
至于响应@SimoEndre,我已经离开了主要方法在代码示例中,但是自从您提到它之后,这是将g.Messege {}带出Messeges通道的函数。
注意: MessageHandler()运行自己的去例程。
func MessageHandler() {
for msg := range Messages {
for _, disc := range LivingDiscussions {
if disc.DiscussionID.UDID == msg.UDID {
go disc.Push(msg)
break
}
}
}
}
'Messages {}'输出在哪里?我没有看到它在某处实施 –
@SimoEndre现在如何?我设法粘贴错误的代码片段。 – Olian04
看看大头钉的痕迹,看看每个goroutine被阻挡的位置 – JimB