2016-05-06 1 views
0
に同じのWebSocket上

を複数回書くまず、コンテキスト:読む&ゴー

  • 私は行くことはかなり新しいよ、私は1つの5週間のコースを取るが、それについてのthatsました。
  • 私はネットワーキングに新しい人です。私は数日間、ウェブソケット(外出中)で遊んでいます。

私は小さなチームで作業しています。私は、Webソケットを使用して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") 

サーバーは最初にエンコードされたメッセージを読み取ります。
しかし、2番目のものを読み取れません。

最初のメッセージ

は、この機能

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

に読み込まれ、2番目のメッセージは、上記の関数の最後の行で開始し、外出先ルーチンに読み込まれます。

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

なぜサーバーは2番目のメッセージを読んでいませんか?
どうすればこの問題を解決できますか?
ありがとうございます!

+0

あなたが[バギー]を使用していることが表示されます(https://github.com/gorilla/websocket#gorilla-websocket-:ハンドラ関数で作業を行う代わりに、ゴルーチンを開始、これを修正するには他のパッケージと比較)x/net/websocketパッケージ[Gorilla](https://godoc.org/github.com/gorilla/websocket)を使用し、ゴリラの[チャットの例](https://github.com/gorilla/websocket/tree/master/examples/chat)から始めてみてください。 )。 –

答えて

0

x/net/websocketパッケージは、ハンドラから戻ったときに接続を閉じます。

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

ありがとうございました。 – Olian04