2016-06-07 6 views
4

Hallo, ich versuche WhatsApp Funktionalität mit Elixier Phoenix neu zu implementieren. Ich habe ein Problem beim Ausfindigmachen folgender Dinge: Wenn alle Personen im Chatroom die Nachricht erhalten haben, möchte ich dem Besitzer des Nachrichtenstatus "Received" senden, damit er das Doppeltickersymbol anzeigen kann. Wie übertragen Sie jedoch einen bestimmten Client?Phoenix Kanäle: senden Push an einen bestimmten Client

+0

Überprüfen Sie diese Frage: http://stackoverflow.com/questions/37373766/phoenix-return-ecto-query-results-to-a-specific-client/37375057#37375057 – simo

+0

@simo Die Frage ist ein bisschen aus , weil Client A die Nachricht sendet und die Nachricht ebenfalls empfängt. Was ich brauche ist: Client A sendet die Nachricht und nur Client B erhält eine Rückmeldung – Nomad

+0

Ich denke, es ist eine gute Idee, ein Thema nur für den Client B zu widmen, dann können Sie zu diesem Thema senden, sonst weiß ich nicht wie Einen bestimmten Benutzer ausschließen, siehe hier: http://stackoverflow.com/questions/37279779/how-to-exclude-some-users-when-broadcast – simo

Antwort

3

Sie können dies pro Benutzer über Thema lösen, kann dies leicht durch Musterabgleich implementiert werden, beachten Sie die Sicherheitsüberprüfung auch:

def join("users:" <> user_id, _params, socket) do 
    {user_id, _} = Integer.parse(user_id) 

    %{id: id} = socket.assigns[:user] 

    #prevent connection to solo channel of other users, but allow in development 
    case id == user_id || Mix.env == :dev do 
     true -> 
     {:ok, socket} 
     false -> 
     {:error, "This is not your solo channel!"} 
     end 
    end 

Wie Sie den Benutzer von Repo.get gespeichert haben würde, wenn der Benutzer die Verbindung Buchse an:

defmodule MyApp.UserSocket do 
    use Phoenix.Socket 

    def connect(%{"token" => token}, socket) do 
    case Phoenix.Token.verify(socket, "user", token, max_age: 1209600) do 
     {:ok, user_id} -> 
     socket = assign(socket, :user, Repo.get!(User, user_id)) 
     {:ok, socket} 
     {:error, _} -> #... 
    end 
    end 
end 

Und schließlich können Sie Nachrichten an einen bestimmten Benutzer aus der Fassung Kontext senden als:

YourAll.Endpoint.broadcast user_topic, "message", %{details: "etc"} 

Um die Leistung zu testen, ist dies eine very informative session in der Gary Rennie zeigt, wie WebSockets mit Tsung Tool Benchmark.

Verwandte Themen