2013-12-17 4 views
5

Я хочу реализовать SocketIO в моем проекте.Реализация SocketIO в ios

Ниже приведены серверные и клиентские коды для моего проекта.

На стороне клиента есть тестовая кнопка, которая отправляет запрос на отправку ([self.afn post:@"/test" withParams:@{} completion:^(id obj{})]) на сервер. self.afn - мой экземпляр объекта моего класса-оболочки для AFNetworking library.

на стороне сервера перехватывает этот запрос поста с функцией app.post('test', function(){...} В этом обработчике сообщения запроса, я испускаю данные ({hello: "world"}) на news канале, и я ожидать, чтобы поймать эти данные на стороне клиента в didReceiveMessage обработчике SocketIO library for Objective C.

Я проверил, что кнопка успешно отправляет запрос на отправку, и серверная сторона успешно обрабатывает этот пост-запрос и испускает данные (hello:"world") на канале news. Однако клиентская сторона не использует эти данные для обработчика 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 

РЕДАКТИРОВАТЬ:

Я следовал предложению Мати и «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

я есть нет большого опыта работы с 'C#', но попробуйте рассмотреть node.js как серверную, я считаю, что это сэкономит вам много времени. – Gntem

+0

Это nodejs, уже. – ankakusu

ответ

2

EDIT: Окончательный ответ в том, что вы должны уже использовали didReceiveEvent метод делегата вместо didReceiveMessage

В mySocket.emit('news', { hello: "world"}); линии, вы не указания каких-либо имен. В коде ObjC, вы подключаете свой сокет к пространству имен :-)

Вы должны использовать то: io.of('/news').emit('news', { hello: 'world' });

Вы смешивались пространства имен с именами событий!

(или просто передать nil пространство имен в ObjC коде, это будет проще)

+0

Спасибо за предложение, я отредактировал мое сообщение соответственно, но, тем не менее, на стороне клиента 'didreceivemessage' не срабатывает, и я уверен, что сообщение получено на стороне клиента, потому что я видел сообщение на консоли. Когда я отправляю сообщение от отправителя, имя события - «новости», но на стороне клиента я не упоминал имя события. Может ли это быть причиной? – ankakusu

+1

@ankakusu Возможно, вам стоит попробовать использовать этот делегат вместо didRecieveMessage: '- (void) socketIO: (SocketIO *) socket didReceiveEvent: (SocketIOPacket *) пакет; ' –

+0

Да, он ловит' didReceiveEvent'. Можете ли вы отредактировать свой ответ, тогда я могу принять его как ответ :) Кстати, какова функция события 'doneRecieveMessage'? – ankakusu

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

Спасибо за предложение, ваш способ безопаснее, но все же , на стороне клиента 'didreceivemessage' не запускается, и я уверен, что сообщение получено на стороне клиента, потому что я видел сообщение на консоли. Когда я отправляю сообщение от отправителя, имя события - «новости», но на стороне клиента я не упоминал имя события. Может ли это быть причиной? – ankakusu

+0

Я ранее разрабатывал приложение, использующее SocketRocket (как клиент socket.io) и .net, но у меня мало информации о node.js Этот пример: http://www.tokbox.com/blog/creating -chat-roulette-on-ios-with-node-js-socket-io-and-opentok/может быть полезна для изучения. – torun

Смежные вопросы