使用して何も問題はありませんGoのミューテックス。ここでは、ミューテックスを使用したソリューションです。
エンドポイントのマップを宣言します。私は、文字列のキーは、エンドポイントを識別するのに十分であることを前提とします。クライアントが接続したときに
type endpoint struct {
c *websocket.Conn
sync.Mutex // protects write to c
}
var (
endpoints = map[string]*endpoint
endpointsMu sync.Mutex // protects endpoints
)
func addEndpoint(key string, c *websocket.Connection) {
endpointsMu.Lock()
endpoints[key] = &endpoint{c:c}
endpointsMu.Unlock()
}
func removeEndpoint(key string) {
endpointsMu.Lock()
delete(endpoints, key)
endpointsMu.Unlock()
}
func sendToEndpoint(key string, message []byte) error {
endpointsMu.Lock()
e := endpoints[key]
endpointsMu.Unlock()
if e === nil {
return errors.New("no endpoint")
}
e.Lock()
defer e.Unlock()
return e.c.WriteMessage(websocket.TextMessage, message)
}
はaddEndpoint
とのマップへの接続を追加します。接続を閉じるときにremoveEndpoint
でマップから接続を削除します。名前付きエンドポイントにメッセージを送信する:sendToEndpoint
この問題を解決するためにGorilla chat exampleを適用することができます。ハブマップをconnections map[string]*connection
に変更し、接続とキーのあるタイプを送信するようにチャネルを更新し、ブロードキャストループを変更して単一の接続に送信します。
コードがなくても手伝ってもらえません。これを実装する際にどのような問題が発生しているのかを具体的に説明できますか? – JimB
'gorilla/websocket'チャットの例をチャットルームとして実装していますが、1対1で動作するように変更することができます。 – sfault
正確に何を共有したいですか? – Uvelichitel