2016-05-06 55 views
0

首先,语境:读取和写入多次在相同的WebSocket中去

  • 我是相当新的走了,我已经拿当然一个5周,但仅此而已。
  • 我都是新来的网络,我一直玩Websockets(在去)几天。

我正在一个小团队工作,并且我的任务是使用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}} 

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

而在旅途中程序读取第二消息在上面的函数的最后一行开始。

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

为什么不让服务器读取第二条消息?
我该如何解决这个问题?
谢谢!

+0

看来,您使用的是[车](https://github.com/gorilla/websocket#gorilla-websocket-与其他软件包比较)x/net/websocket软件包。考虑使用[大猩猩](https://godoc.org/github.com/gorilla/websocket)并从Gorilla的[聊天示例]开始(https://github.com/gorilla/websocket/tree/master/examples/chat )。 –

回答

0

x/net/websocket程序包在处理程序返回时关闭连接。为了解决这个问题,做了处理函数的工作,而不是在开始的goroutine:

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

谢谢,现在按预期工作。 – Olian04