Socket IO при подключении состояния гонки?

102
11

Я работаю с socketio (1.2.0) в настоящее время и обнаружил, что похоже, что событие connect стороне клиента не означает, что соединение готово, кто-нибудь еще видел эту проблему или есть что-то, чего я не вижу?

У меня довольно большое приложение, которое работает в контексте расширения chrome google; однако я вытащил код, чтобы убедиться, что это проблема.

Вот мой код клиента (это работает иногда, не всегда):

var connection = io.connect("http://localhost:3000/myNamespace",
{transport:"websocket", reconnection:false});
connection.on("connect",function(){
connection.emit("myEvent",{"testKey":"testData"});
);

Вот мой код сервера:

var namespace = io.of("/myNamespace");
namespace.on("connection",function(handshake) {
auth.main(handshake , function(error , socket){
socket.on("myEvent" , function(data){console.log("Event Data:",data);});
}
}

Если я изменю свой клиентский код, чтобы выглядеть так, он работает в 100% случаев (просто не использовал бы его):

var connection = io.connect("http://localhost:3000/myNamespace",
{transport:"websocket",reconnection:false});
connection.on("connect", function() {
setTimeout(function(){
connection.emit("myEvent",{"testKey":"testData"});
},1000);

Я проверил событие в первом примере клиентского кода, которое не испускается с помощью tcpdump и wirehark.

Любые идеи, если сокет не может быть "готовым", но он может излучать события из-за состояния гонки?

спросил(а) 2014-12-17T03:17:00+03:00 4 года, 12 месяцев назад
1
Решение
47

Это немного догадка, но объяснение слишком длинное для комментария, поэтому я отвечу ему в ответ. Мне интересно, вызывает ли ваш auth задержка, и вам нужно дождаться завершения авторизации до того, как ваше соединение действительно будет работать правильно.

Что произойдет, если после завершения авторизации вы отправите сообщение клиенту, и когда это сообщение будет получено клиентом, тогда (и только тогда, когда вы знаете, что это сделано) вы отправляете данные от клиента?

Клиент:

var connection = io.connect("http://localhost:3000/myNamespace");
connection.on("ready", function(data) {
console.log("Received ready");
connection.emit("myEvent",{"testKey":"testData"});
});
connection.on("connect",function(){
console.log("Received connect");
);

Сервер:

var namespace = io.of("/myNamespace");
namespace.on("connection",function(handshake) {
auth.main(handshake , function(error , socket) {
socket.emit("ready", true);
socket.on("myEvent" , function(data){console.log("Event Data:",data);});
}
}

Похоже, что вы выполняете аутентификацию вне поддерживаемого способа, чтобы выполнить авторизацию, поэтому, возможно, это вызывает проблему синхронизации, потому что socket.io не знает о вашем auth, поэтому он отправляет сообщение connect, но вы по-прежнему выполняете свой собственный auth,

Вы можете увидеть рекомендуемый способ сделать auth интегрированным в последовательность соединений с socket.io здесь: https://github.com/Automattic/socket.io/wiki/Authorizing

ответил(а) 2014-12-17T21:40:00+03:00 4 года, 12 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема