在ios中实现SocketIO

ank*_*usu 6 objective-c node.js ios socket.io

我想在我的项目中实现SocketIO.

我的项目的服务器端和客户端代码如下所示.

在客户端,有一个测试按钮,它向[self.afn post:@"/test" withParams:@{} completion:^(id obj{})]服务器端发送一个post请求().self.afn是我的AFNetworking库包装类的实例对象.

服务器端使用函数捕获此post请求app.post('test', function(){...} 在此post请求处理程序中,我{hello: "world"}news通道中发出data(),并且我希望在客户端在Objective CdidReceiveMessageSocketIO库的处理程序中捕获此数据.

我检查了一下,该按钮成功发送了post请求,服务器端成功处理了这个post请求并hello:"world"news通道上发出data().但是,客户端不会在didReceiveMessage处理程序上捕获此数据.

问题出在哪儿?你有什么主意吗?

服务器和客户端代码的详细信息如下:

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"});
        }
});
Run Code Online (Sandbox Code Playgroud)

客户端:

//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
Run Code Online (Sandbox Code Playgroud)

编辑:

我跟马修"OTAK"阿米奥特的建议,改变了[self.socket connectToHost: @"172.20.10.5" onPort:8090 withParams:nil withNamespace:@"news"];[self.socket connectToHost: @"172.20.10.5" onPort:8090];

现在,我可以在控制台上看到消息,但是,当在客户端收到消息时,didReceiveMessage不会调用处理程序.

当我从发件人发送邮件时,事件的名称是"新闻",但在客户端我没有提到事件名称.这可能是原因吗?

Mat*_*iot 2

编辑:最终的答案是你应该使用didReceiveEvent委托方法而不是didReceiveMessage

在该mySocket.emit('news', { hello: "world"});行中,您没有指定任何名称空间。在您的 objc 代码中,您将套接字连接到命名空间:-)

那么你应该使用:io.of('/news').emit('news', { hello: 'world' });

您将命名空间与事件名称混合在一起!

(或者只是传递nil到 objc 代码中的命名空间,这会更容易)