2016-03-22 11 views
2

現在、携帯電話からサーバ経由でWebSocketを使用してブラウザに送信されたデータを中継するアプリケーションに取り組んでいます。私はサーバーを書いています。次の図に示すように、携帯電話とブラウザの間には1対1の関係があります。複数のクライアント間で同時にデータを中継する

communication flow between mobile phone and server

しかし、私は複数のセッションを同時に動作させたいと思います。

私はゴルーチンとチャネルを使って "通信でメモリを共有する"という原則に従う並行性モデルを提供しています。 sync.Mutexプリミティブを使用してロックするのではなく、前述の原理を使用する方が好きです。

しかし、私はこの情報を私の問題にマップすることができず、解決策を提案できるかどうか質問したいと思っていました。

+0

コードがなくても手伝ってもらえません。これを実装する際にどのような問題が発生しているのかを具体的に説明できますか? – JimB

+2

'gorilla/websocket'チャットの例をチャットルームとして実装していますが、1対1で動作するように変更することができます。 – sfault

+0

正確に何を共有したいですか? – Uvelichitel

答えて

1

使用して何も問題はありません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に変更し、接続とキーのあるタイプを送信するようにチャネルを更新し、ブロードキャストループを変更して単一の接続に送信します。

2

私はあなたの問題に似ていましたが、私は複数のサーバーを介してお互いにデータを送信する複数の接続が必要でした。

私はあなたがまた、外出先で書かれている鉱山のプロジェクトを見て、手でプロトコルを使用することができますWAMPプロトコル

WAMP is an open standard WebSocket subprotocol that provides two application messaging patterns in one unified protocol: 
Remote Procedure Calls + Publish & Subscribe. 

と一緒に行きました:github.com/neutrinoapp/neutrino

+0

ありがとうございますが、さらなるプロトコルが私のニーズに合うとは思いません。また、クライアントはAndroidと最終的にiOSとWindows Phoneで動作する必要があります。したがって、単純なソケット接続を使用したいと考えています。 – Lukas

+0

これは、下の単純なソケット接続です。 –

関連する問題