为了账号安全,请及时绑定邮箱和手机立即绑定

在 go 中通过同一个 websocket 多次读写

在 go 中通过同一个 websocket 多次读写

Go
守候你守候我 2022-01-10 11:01:37
首先,上下文:我是新手,我已经参加了 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()


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号