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

首先,上下文:


我是新手,我已经参加了 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.Discussion

err = 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()

        }

    }

}

为什么服务器不会读取第二条消息?

我该如何解决这个问题?

谢谢!


守候你守候我
浏览 227回答 1
1回答

子衿沉夜

x/net/websocket 包在处理程序返回时关闭连接。要解决此问题,请在处理函数中完成工作,而不是启动 goroutine:g.LivingDiscussions[len(g.LivingDiscussions)-1].Participants[0].Listen()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go