Implementación de SocketIO en ios

Quiero implementar SocketIO en mi proyecto.

Los códigos del lado del servidor y del lado del cliente para mi proyecto se dan a continuación.

En el lado del cliente, hay un botón de prueba que envía una solicitud posterior ( [self.afn post: @ "/ test" withParams: @ {} completion: ^ (id obj {})] ) al lado del servidor. self.afn es mi objeto instancia de mi clase contenedora para biblioteca AFNetworking .

El lado del servidor capta esta solicitud de publicación con la función app.post ('test', function() {...} En este controlador de solicitud de publicación, emito un dato ( {hello: "world"} ) en el canal news y espero capturar estos datos en el lado del cliente en el didReceiveMessage manejador de la biblioteca SocketIO para Objective C .

Lo comprobé, el botón envía correctamente la solicitud de publicación y el lado del servidor maneja con éxito esta solicitud de publicación y emite los datos ( hello: "world" ) en el canal news . Sin embargo, el lado del cliente no captura estos datos en el controlador didReceiveMessage .

¿Dónde está el problema? ¿Tiene alguna idea?

Los detalles de los códigos para el servidor y el cliente se detallan a continuación:

El ServerSide:

//server.js
var express = require('express');
var app = module.exports = express();
/* configure app ... */
var io = require('socket.io').listen(8090);
var mySocket;

io.sockets.on('connection', function (socket) {
    mySocket = socket;
}); 

app.post("/test", function(req, res){
        if(mySocket){
            mySocket.emit('news', { hello: "world"});
        }
});

El cliente:

//Client side in ObjectiveC
@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.txtFrom.delegate = self;
    self.txtTo.delegate = self;

    //initialize socket
    self.socket = [[SocketIO alloc] initWithDelegate:self];
    [self.socket connectToHost: @"172.20.10.5" onPort:8090];

}

// IBAction for the test button to send a post request to the server to activate
- (IBAction)actTest:(id)sender {
    //self.afn is my wrapper class for AFNetworking
    [self.afn post:@"/test" withParams:@{@"foo": @"bar"} completion:^(id responseObj){
        NSLog(@"Response object: %@", responseObj);
    }];
}

- (void) socketIO:(SocketIO *)socket didReceiveMessage:(SocketIOPacket *)packet
{
    NSLog(@"didReceiveMessage() >>> data: %@", packet.data);
}
@end

EDITAR:

I followed the suggestion of Mathieu 'OtaK' Amiot and changed [self.socket connectToHost: @"172.20.10.5" onPort:8090 withParams:nil withNamespace:@"news"];to [self.socket connectToHost: @"172.20.10.5" onPort:8090];

Ahora, puedo ver el mensaje en la consola, sin embargo, cuando el mensaje se recibe en el lado del cliente, el manejador didReceiveMessage no se invoca.

Cuando envío el mensaje del remitente, el nombre del evento es "noticias", pero en el lado del cliente no mencioné el nombre de un evento. ¿Puede ser esta la razón?

0
Es nodejs, ya.
agregado el autor ankakusu, fuente
no tengo una gran experiencia con C# pero trato de considerar node.js como su servidor, creo que le ahorraría mucho tiempo.
agregado el autor Gntem, fuente

2 Respuestas

EDIT: la respuesta final es que deberías haber usado el método delegado didReceiveEvent en lugar de didReceiveMessage

En la línea mySocket.emit ('news', {hello: "world"}); , no está especificando ningún espacio de nombres. En tu código objc, estás conectando tu socket a un espacio de nombres :-)

You should be using then : io.of('/news').emit('news', { hello: 'world' });

¡Estabas mezclando espacios de nombres con nombres de eventos!

(O simplemente pase nil al espacio de nombres en el código objc, será más fácil)

0
agregado
Gracias por la sugerencia, edité mi publicación en consecuencia pero, aún así, en el lado del cliente didreceivemessage no se activa y estoy seguro de que el mensaje llega al cliente, porque vi el mensaje en la consola. Cuando envío el mensaje desde el remitente, el nombre del evento es "news" , pero en el lado del cliente no mencioné el nombre de un evento. ¿Puede ser esta la razón?
agregado el autor ankakusu, fuente
Sí capta el didReceiveEvent . ¿Puedes editar tu respuesta, entonces puedo aceptarla como la respuesta :) Por cierto, ¿cuál es la función del evento didRecieveMessage ?
agregado el autor ankakusu, fuente
@ankakusu Quizás debería intentar usar este delegado en lugar de didRecieveMessage: - (void) socketIO: (SocketIO *) socket didReceiveEvent: (SocketIOPacket *) paquete;
agregado el autor Mathieu Amiot, fuente
Editado;) Supongo que didRecieveMessage está hecho para la mensajería raw websocket como se describe aquí: github.com/LearnBoost/socket.io/wiki/Messaging
agregado el autor Mathieu Amiot, fuente

puedes intentarlo de esta manera

io.sockets.on('connection', function (socket) {

    app.post("/test", function(req, res){
        if(mySocket){
            socket.emit('news', { hello: "world"});
        }
    });

}); 

en lugar de esto:

io.sockets.on('connection', function (socket) {
    mySocket = socket;
}); 

app.post("/test", function(req, res){
        if(mySocket){
            mySocket.emit('news', { hello: "world"});
        }
});
0
agregado
Gracias por la sugerencia, su camino es más seguro pero, aún así, en el lado del cliente didreceivemessage no se activa y estoy seguro de que el mensaje llega al cliente, porque vi el mensaje en el consola. Cuando envío el mensaje del remitente, el nombre del evento es "noticias", pero en el lado del cliente no mencioné el nombre de un evento. ¿Puede ser esta la razón?
agregado el autor ankakusu, fuente
Previamente había desarrollado una aplicación usando SocketRocket (como cliente socket.io) y servicio de Windows .net, pero no tengo mucha información sobre node.js Este ejemplo: tokbox.com/blog/… puede ser útil para examinar.
agregado el autor torun, fuente