2017-12-21 37 views
3

Ich habe an einer Webanwendung gearbeitet, die im Wesentlichen ein Web-Messenger ist, der sinatra verwendet. Mein Ziel ist es, alle Nachrichten mit PGP verschlüsselt zu haben und Vollduplex-Kommunikation zwischen Clients mit Faye Websocket zu haben.Wie kann ich mit Faye Websockets Nachrichten an bestimmte Clients senden?

Mein Hauptproblem ist, Nachrichten mit faye an einen bestimmten Client senden zu können. Um das hinzuzufügen, werden alle meine Nachrichten in einem einzigen Chatroom für jede Person doppelt gespeichert, da es pgp-verschlüsselt ist.

Bis jetzt habe ich darüber nachgedacht, ein neues Socket-Objekt für jeden Client zu starten und sie in einem Hash zu speichern. Ich weiß nicht, ob dieser Ansatz der effizienteste ist. Ich habe gesehen, dass socket.io zum Beispiel erlaubt Ihnen, zu einem bestimmten Klienten aber nicht mit faye websockets zu emittieren, scheint es? Ich überlege mir auch, vielleicht ein Pub-Sub-Modell zu verwenden, aber ich bin mir wieder nicht sicher.

Jeder Rat wird geschätzt, danke!

+0

Ich bin 'iodine' des Autor, also könnte ich voreingenommen sein, aber ich würde in Erwägung ziehen, einen Kanal nach der verwendeten ID (dh 'user1' ...' user201983') und Senden der Nachricht an den Kanal des Benutzers. Bei Verwendung der Jod native websockets und eingebauten Pub/sub , das ist ziemlich effektiv. – Myst

Antwort

1

Ich bin iodine's Autor, also könnte ich in meinem Ansatz voreingenommen sein.

halte ich würde einen Kanal durch die verwendeten ID Namensgebung (dh user1 ... user201983 und sendet die Nachricht an den Kanal des Benutzers.

Ich denke, Faye dies unterstützen wird. Ich weiß, dass, wenn die Jod nativen WebSockets mit und builtin pub/sub, ist dies sehr effektiv.

Bisher habe ich gedacht, der Gründung eines neuen Socket-Objekt für jeden Kunden und sie in einer Hash-Speicherung ...

Dies ist ein sehr häufiger Fehler, der oft in einfachen Beispielen zu sehen ist.

Es funktioniert nur in einzelnen Prozessumgebungen und als Sie müssen die gesamte Logik umwandeln, um Ihre Anwendung zu skalieren.

Der Kanalansatz ermöglicht die Skalierung mit Redis oder einem anderen Pub/Sub-Dienst, ohne die Logik Ihrer Anwendung neu zu codieren.

Hier ist ein kleines Beispiel, das Sie aus dem Ruby-Terminal ausführen können (irb). Ich verwende plezi.io nur um es kürzer Code ein bisschen zu machen:

require 'plezi' 

class Example 
    def index 
    "Use Websockets to connect." 
    end 
    def pre_connect 
    if(!params[:id]) 
     puts "an attempt to connect without credentials was made." 
     return false 
    end 
    return true 
    end 
    def on_open 
    subscribe channel: params[:id] 
    end 
    def on_message data 
    begin 
     msg = JSON.parse(data) 
     if(!msg["to"] || !msg["data"]) 
     puts "JSON message error", data 
     return 
     end 
     msg["from"] = params[:id] 
     publish channel: msg["to"].to_s, message: msg.to_json 
    rescue => e 
     puts "JSON parsing failed!", e.message 
    end 

    end 
end 

Plezi.route "/" ,Example 
Iodine.threads = 1 
exit 

dieses Beispiel zu testen, einen Javascript-Client verwenden, vielleicht so etwas wie folgt aus:

// in browser tab 1 
var id = 1 
ws = new WebSocket("ws://localhost:3000/" + id) 
ws.onopen = function(e) {console.log("opened connection");} 
ws.onclose = function(e) {console.log("closed connection");} 
ws.onmessage = function(e) {console.log(e.data);} 
ws.send_to = function(to, data) { 
    this.send(JSON.stringify({to: to, data: data})); 
}.bind(ws); 

// in browser tab 2 
var id = 2 
ws = new WebSocket("ws://localhost:3000/" + id) 
ws.onopen = function(e) {console.log("opened connection");} 
ws.onclose = function(e) {console.log("closed connection");} 
ws.onmessage = function(e) {console.log(e.data);} 
ws.send_to = function(to, data) { 
    this.send(JSON.stringify({to: to, data: data})); 
}.bind(ws); 

ws.send_to(1, "hello!") 
+0

Wow, danke viel Ich hatte noch nie von plezi.io gehört, bevor ich es versuchen werde. Sehr geschätzt! –

+0

@MichelChatmajian, Gern geschehen. Wenn meine Antwort geholfen hat, stimmen Sie bitte ab und akzeptieren Sie die Antwort. Ich glaube, Sie können dasselbe mit Sinatra und Faye tun, die gleichen Konzepte sollten gelten (obwohl es mehr Code erfordern könnte). – Myst

Verwandte Themen