2013-05-19 4 views
1

J'essaie de comprendre comment fonctionnent les sockets Web. J'ai la compréhension de base que, contrairement à AJAX dans la connexion Web Sockets est toujours ouverte, ce qui est pratique pour les applications en temps réel.Sockets Web demandes multiples

Ceci est très exemple de base en utilisant des chaussettes:

var sock = new SockJS('http://mydomain.com/my_prefix'); 

    sock.onopen = function() { 
     console.log('open'); 
    }; 

    sock.send("request to send (JSON)"); 

    sock.onmessage = function(e) { 
     console.log('message', e.data); 
    }; 

    sock.onclose = function() { 
     console.log('close'); 
    }; 

Exigence: J'ai plusieurs widgets pour afficher des données en temps réel, donc je veux chaque widget pour vous abonner à une demande JSON/service, garder la connexion ouverte et se désinscrire chaque fois que nécessaire.

Question: Dans ce cas, comment pouvons-nous gérer plusieurs demandes, comme nous le faisons avec l'installation AJAX typique?

Je vais apprécier si quelqu'un peut me guider pour corriger la direction, donnez-moi un exemple ou un lien vers un tutoriel.

Quelqu'un?

Répondre

2

La chose est que avec HTTP lorsque vous envoyez des demandes multiples, dites reqA, reqB, reqC, le serveur doit répondre à ces demandes dans le même ordre resA, resB, resC (ce qui est sous l'hypothèse que keep-alive est sur voir the specification). Le navigateur sait alors quelle réponse est à quelle requête.

Mais avec WebSockets, vous devez écrire ce code manuellement. Il y a aussi d'autres options. Par exemple l'une des idée intéressante est d'utiliser le système événement. Le serveur accepte les données JSON sous la forme

{ 
    "event": "test", 
    "data": ["foo"] 
} 

et il envoie les données au client sous la même forme. Dans cette situation, vous pouvez faire quelque chose comme ceci:

var EventManager = // some code here; 
sock.onmessage = function(e) { 
    var msg = JSON.parse(e.data); 
    EventManager.trigger(msg.event, msg.data); 
}; 

et vous pouvez vous inscrire à des événements simplement en faisant

EventManager.on("test", function(data) { 
    // handle "test" event here 
}); 

Bien sûr, vous devez mettre en œuvre EventManager. Pour cela, vous pouvez utiliser l'une des implémentations existantes, comme Backbone.js ou vous pouvez l'appliquer à vous-même, comme ici:

Implementing events in my own object

+0

Exactement ce que je cherchais. Je posterai une fois que j'aurai implémenté ma solution. Merci –

+0

Je parie que quelqu'un doit avoir fait cela avant, êtes-vous au courant de quelques repos de github? –

+0

@ fe-ninja Je pense que Socket.IO utilise une idée similaire (mais il est intégré avec le côté serveur). Je ne connais aucune bibliothèque côté client pour cela. Eh bien, ce n'est pas si difficile en premier lieu. – freakish