2017-10-01 2 views
0

sur Swift, j'utilise socket.on("test") {data, ack in print(data) } problèmes pour l'inscription d'une chambre (prise) avec Socket.IO-client Swift et Swift, Sails.js sur le serveur

Pour vous abonner à une chambre (prise) sur mon API Sails.js.

Lorsque je diffuse un message à partir du serveur, avec

sails.sockets.broadcast('test', { text : 'ok' })

le gestionnaire socket.on() n'est jamais appelé. Toutefois, si je mets TRUE à "config" lors de la connexion de mon client socket.io de swift, dans les journaux Socket-IO le message arrive.

Qu'est-ce qui ne va pas?

Répondre

0

Merci pour votre réponse, @arbuthnott

Finalement, je trouve mon erreur:

L'ensemble du processus, je l'ai fait raison: (La demande de se joindre à la salle se fait par le serveur, avec des voiles .sockets.join())

Une mauvaise chose utilisait socket.on() avec le paramètre "ROOM NAME".

Je vais vous expliquer mieux, pour d'autres ayant même problème:

1) De Swift vous devez souscrire une demande de websocket à un point de terminaison sur le serveur qui accepte la demande de websocket (GET, POST, PUT). Dans un exemple, vous pouvez faire une requête POST, en passant dans le corps le nom de la pièce à laquelle vous voulez vous abonner.

I.e.:

socket.emitWithAck("post",["room": "testroom", "url": "/api/v1.0/roomsubscribing"]).timingOut(after: 0) {data in print("Server responded with \(data)") }

2) côté serveur, dans le point final de roomsubscribing vous avez le code suivant:

roomsubscribing: function(req, res) { 
     if(!req.isSocket) { 
      return res.badRequest(); 
     } 

     sails.sockets.join(req, req.params('room'), function(err) { 
      if (err) { 
      return res.serverError(err); 
      } 
     }); 
    } 

3) Lorsque le serveur souhaitez diffuser des données aux abonnés du "testroom" chambre, le code suivant doit être utilisé:

sails.sockets.broadcast('testroom', { message: 'testmessage' }

maintenant, le truc est ici: Sur Swift vous devez utiliser:

socket.on("message") { data, ack in print(data) }

afin d'obtenir le gestionnaire de messages fonctionne. Je pensais que vous devriez utiliser le nom de la salle, à la place, vous devriez utiliser la clé de l'entrée KEY/VALUE que vous avez utilisé dans votre serveur lorsque vous avez diffusé les données (dans ce cas, "message").

Maintenant, cela fonctionne comme un charme.

Salutations,

Mike

0

J'ai seulement une petite quantité d'expérience avec les prises de courant, mais si personne ne répond d'autre ...

Je pense que vous manquez la première étape du processus de prise en trois étapes:

  1. A le client envoie un message au serveur demandant à s'abonner à une pièce particulière.

  2. Le client configure un socket.on pour gérer des événements particuliers de cette pièce.

  3. Le serveur diffuse un événement dans une pièce particulière. Tous les abonnés/clients avec un .on pour cet événement particulier vont réagir.

Je peux me tromper, mais il semble que vous ayez manqué la première étape. Votre client doit envoyer un message avec io.socket, quelque chose comme here, puis votre serveur doit utiliser la demande de socket pour les faire rejoindre la pièce, quelque chose comme dans l'exemple here.

(la présence de données de journal sans la mise à feu socket.on semble confirmer que l'événement a été diffusé dans la salle, mais que le client n'a pas souscrit)

Bonne chance!