を複数回書くまず、コンテキスト:読む&ゴー
- 私は行くことはかなり新しいよ、私は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番目のメッセージを読んでいませんか?
どうすればこの問題を解決できますか?
ありがとうございます!
あなたが[バギー]を使用していることが表示されます(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)から始めてみてください。 )。 –