在IOS中实现SocketIO

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

我的项目的服务器端和客户端代码如下。

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

服务器端通过函数app.post('test', function(){...}捕获这个post请求app.post('test', function(){...}在这个post请求处理程序中,我在news频道发出一个数据( {hello: "world"} )我期望在Objective C的SocketIO库的didReceiveMessage处理程序中捕获客户端上的这些数据。

我查了一下,button成功发送发布请求,服务器端成功处理这个发布请求,并在news频道发出数据( hello:"world" )。 但是,客户端不会在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"}); } }); 

客户端:

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

编辑:

我遵循Mathieu'OtaK'Amiot的build议,改变了[self.socket connectToHost: @"172.20.10.5" onPort:8090 withParams:nil withNamespace:@"news"];[self.socket connectToHost: @"172.20.10.5" onPort:8090];

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

当我从发件人发送消息时,事件的名称是“新闻”,但在客户端,我没有提到事件名称。 这可以是原因吗?

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

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

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

你在混合命名空间和事件名称!

(或者只是将nil传递给objc代码中的名称空间,它会更容易)

你可以试试这个方法吗?

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

而不是这个:

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