阅读&在go中使用相同的websocket多次写入

时间:2016-05-06 15:31:31

标签: json go websocket

首先,上下文:

  • 我是一个相当新的人,我已经参加了一个为期5周的课程,但那就是它。
  • 我对网络都很陌生,而且我已经玩了几天的websockets(在go)。

我在一个小团队工作,我的任务是使用Websockets开发一个IRC服务器(在go)。为了让我能够确保服务器正常工作,我已经编写了一个小型测试框架(也在go中)。

现在解决手头的问题:
问题出在这段代码中。

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}}

    g.LivingDiscussions = append(g.LivingDiscussions, disc)
    Log.Activity("Discussion", "Created", disc.DiscussionID.Subject)

    di = g.Discussion{
        DiscussionID: discID,
        Participants: []g.UserID{dc.Creator}}

    enc := json.NewEncoder(ws)
    err = enc.Encode(di)
    Log.Err(err, "enc.Encode")

    go g.LivingDiscussions[len(g.LivingDiscussions)-1].Participants[0].Listen()
}

第二条消息是在上面函数的最后一行开始的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 个答案:

答案 0 :(得分:0)

x / net / websocket包在从处理程序返回时关闭连接。要解决这个问题,请在处理函数中执行工作,而不是启动goroutine:

g.LivingDiscussions[len(g.LivingDiscussions)-1].Participants[0].Listen()