我想在我的项目中实现SocketIO。
我的项目的服务器端和客户端代码如下所示。
在客户端,有一个测试按钮,它向服务器端发送一个发布请求([self.afn post:@"/test" withParams:@{} completion:^(id obj{})]
)。 self.afn是我AFNetworking library的包装类的实例对象。
服务器端使用函数app.post('test', function(){...}
捕获此发布请求
在这个post请求处理程序中,我在{hello: "world"}
通道发出一个数据(news
),我期望在SocketIO library for Objective C didReceiveMessage
处理程序的客户端捕获这些数据。 }。
我检查过,该按钮成功发送了帖子请求,服务器端成功处理了此帖子请求,并在hello:"world"
频道上发出了数据(news
)。但是,客户端不会在didReceiveMessage
处理程序上捕获此数据。
问题出在哪里?你有什么想法吗?
服务器和客户端代码的详细信息如下:
服务器端:
//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的建议,并将[self.socket connectToHost: @"172.20.10.5" onPort:8090 withParams:nil withNamespace:@"news"];
更改为[self.socket connectToHost: @"172.20.10.5" onPort:8090];
现在,我可以在控制台上看到该消息,但是,当在客户端收到消息时,didReceiveMessage
处理程序不会被调用。
当我从发件人发送邮件时,事件的名称是“新闻”,但在客户端我没有提到事件名称。这可能是原因吗?
答案 0 :(得分:2)
编辑:最后的答案是您应该使用didReceiveEvent
委托方法而不是didReceiveMessage
在mySocket.emit('news', { hello: "world"});
行中,您没有指定任何名称空间。
在您的objc代码中,您将套接字连接到命名空间: - )
您应该使用:io.of('/news').emit('news', { hello: 'world' });
您正在使用事件名称混合命名空间!
(或者只是将nil
传递给objc代码中的命名空间,它会更容易)
答案 1 :(得分:2)
你可以这样试试吗
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"});
}
});