首先,上下文:我是新手,我已经参加了 5 周的课程,但仅此而已。我对网络很陌生,而且我已经玩了几天的 websockets (in go)。我在一个小团队中工作,我的任务是使用 Websockets 开发一个 IRC 服务器(在运行中)。为了让我能够确保服务器正常工作,我编写了一个小型测试框架(也在进行中)。现在到手头的问题:问题出在这段代码中。enc := json.NewEncoder(ws)creator := g.UserID{Name: _name, UUID: g.GenerateUID(_name + _subject)}ac := g.DiscussionCreate{Subject: _subject, Creator: creator}err = enc.Encode(ac) //This encoding IS read by the server.Log.Err(err, "enc.Encode")dec := json.NewDecoder(ws)var disc, empty g.Discussionerr = dec.Decode(&disc)Log.Err(err, "dec.Decode")send := g.Message{ Msg: "Hello, World!", UDID: disc.DiscussionID.UDID, UUID: creator.UUID}err = enc.Encode(send) //This encoding ISN'T read by the server.Log.Err(err, "enc.Encode")服务器读取第一条编码消息。但是第二个没看懂。在此函数中读取第一条消息func Create(ws *websocket.Conn) { Log.Connection(ws) var dc g.DiscussionCreate var di g.Discussion dec := json.NewDecoder(ws) err := dec.Decode(&dc) //Here <----- Log.Err(err, "dec.Decode") discID := g.DiscussionID{ Subject: dc.Subject, UDID: g.GenerateUID(time.Now().String())} ssUserID := g.SSUserID{ Name: dc.Creator.Name, UUID: dc.Creator.UUID, WS: ws} disc := g.SSDiscussion{ DiscussionID: discID, Participants: []g.SSUserID{ssUserID}}}第二条消息是在上述函数最后一行开始的 go 例程中读取的。func (ssUserID *SSUserID) Listen() { lastMessage := time.Now().Second() dec := json.NewDecoder(ssUserID.WS) empty := "" var msg Message for (lastMessage + ConnTimeout) > time.Now().Second() { if err := dec.Decode(&msg); err == nil { //Here <----- Messages <- msg lastMessage = time.Now().Second() } else if err := dec.Decode(&empty); err == nil { lastMessage = time.Now().Second() } }}为什么服务器不会读取第二条消息?我该如何解决这个问题?谢谢!
1 回答
子衿沉夜
TA贡献1828条经验 获得超3个赞
x/net/websocket 包在处理程序返回时关闭连接。要解决此问题,请在处理函数中完成工作,而不是启动 goroutine:
g.LivingDiscussions[len(g.LivingDiscussions)-1].Participants[0].Listen()
- 1 回答
- 0 关注
- 226 浏览
添加回答
举报
0/150
提交
取消
