2016-05-06 56 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