Implementierung von SocketIO in ios

Ich möchte SocketIO in meinem Projekt implementieren.

Die serverseitigen und clientseitigen Codes für mein Projekt sind unten aufgeführt.

Auf der Clientseite gibt es eine Testschaltfläche, die eine Postanforderung sendet ( [self.afn post: @ "/ test" mit Params: @ {} completion: ^ (id obj {})] ) zur Serverseite. self.afn ist mein Instanzobjekt meiner Wrapper-Klasse für die AFNetworking-Bibliothek .

Die Serverseite fängt diese Postanforderung mit der Funktion app.post ('test', function() {...} ab In diesem Post - Request - Handler gebe ich Daten ( {hallo: "world"} ) im news -Kanal aus und erwarte, dass ich diese Daten auf der Clientseite in der didReceiveMessage -Handler der SocketIO-Bibliothek für Objective C .

Ich habe überprüft, dass die Schaltfläche die Postanforderung erfolgreich sendet und die Serverseite diese Postanforderung erfolgreich verarbeitet und die Daten ( hallo: "world" ) im news -Kanal ausgibt. Die Clientseite erfasst diese Daten des didReceiveMessage -Handlers jedoch nicht.

Wo ist das Problem? Hast du irgendeine Idee?

Die Details der Codes für Server- und Client-Seite sind unten angegeben:

Die ServerSeite:

//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"});
        }
});

Die ClientSide:

//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

BEARBEITEN:

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];

Nun kann ich die Nachricht an der Konsole sehen, aber wenn die Nachricht auf der Clientseite empfangen wird, wird der didReceiveMessage -Handler nicht aufgerufen.

Wenn ich die Nachricht vom Absender sende, ist der Name des Ereignisses "Nachrichten", aber auf der Clientseite habe ich keinen Ereignisnamen erwähnt. Kann das der Grund sein?

0
Es ist nodejs, schon.
hinzugefügt der Autor ankakusu, Quelle
Ich habe keine großartige Erfahrung mit C# aber versuchen Sie, node.js als Ihre Server-Seite zu betrachten, ich glaube, es würde Ihnen viel Zeit sparen.
hinzugefügt der Autor Gntem, Quelle

2 Antworten

BEARBEITEN: Die letzte Antwort lautet, dass Sie anstelle von didReceiveMessage die Methode didReceiveEvent verwendet haben sollten

In der Zeile mySocket.emit ('news', {hallo: "world"}); geben Sie keinen Namespace an. In Ihrem objc-Code verbinden Sie Ihren Socket mit einem Namespace :-)

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

Sie haben Namespaces mit Ereignisnamen gemischt!

(oder geben Sie einfach nil an den Namespace im objc-Code, es wird einfacher)

0
hinzugefügt
Danke für den Vorschlag, ich habe meinen Beitrag entsprechend bearbeitet, aber trotzdem klingelt auf der Clientseite didreceivemessage nicht und ich bin mir sicher, dass die Nachricht auf der Clientseite angekommen ist, da ich die Nachricht an sah die Konsole. Wenn ich die Nachricht vom Absender sende, ist der Name des Ereignisses "news" , aber auf der Clientseite habe ich keinen Ereignisnamen erwähnt. Kann das der Grund sein?
hinzugefügt der Autor ankakusu, Quelle
Ja, es fängt den didReceiveEvent ab. Können Sie bitte Ihre Antwort bearbeiten, dann kann ich sie als Antwort akzeptieren :) Übrigens, was ist die Funktion von didRecieveMessage event?
hinzugefügt der Autor ankakusu, Quelle
@ankakusu Vielleicht sollten Sie versuchen, diesen Delegaten anstelle von didRecieveMessage zu verwenden: - (void) socketIO: (SocketIO *) Socket didReceiveEvent: (SocketIOPacket *) Paket;
hinzugefügt der Autor Mathieu Amiot, Quelle
Bearbeitet;) Ich nehme an, dass didRecieveMessage für rohe WebSocket Nachrichten wie hier beschrieben erstellt wurde: github.com/LearnBoost/socket.io/wiki/Messaging
hinzugefügt der Autor Mathieu Amiot, Quelle

Kannst du es auf diese Weise versuchen?

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

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

}); 

an Stelle von:

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

app.post("/test", function(req, res){
        if(mySocket){
            mySocket.emit('news', { hello: "world"});
        }
});
0
hinzugefügt
Danke für den Vorschlag, Ihr Weg ist sicherer, aber trotzdem, auf der Client - Seite didreceivemessage feuert nicht und ich bin mir sicher, dass die Nachricht auf der Client - Seite angekommen ist, weil ich die Nachricht an der Konsole. Wenn ich die Nachricht vom Absender sende, ist der Name des Ereignisses "Nachrichten", aber auf der Clientseite habe ich keinen Ereignisnamen erwähnt. Kann das der Grund sein?
hinzugefügt der Autor ankakusu, Quelle
Ich hatte zuvor eine Anwendung mit SocketRocket (als socket.io Client) und .net Windows-Dienst entwickelt, aber ich habe nicht viele Informationen über node.js Dieses Beispiel: tokbox.com/blog/… kann nützlich sein untersuchen.
hinzugefügt der Autor torun, Quelle