2016-01-27 3 views
0

Моя текущая проблема заключается в том, что есть два браузера (два пользователя). Как только они оба подключены, они могут выполнить определенное событие сокета, которое является запросом друзей, но не одновременно. Всегда нужно обновлять одну из страниц пользователя.Сокет io не работает в обе стороны?

Иллюстративно

enter image description here

Когда пользователь нажимает на эту кнопку

панели Navbar glyphicon будет увеличиваться на 1

enter image description here

Serverside событие

io.on('connection', function(socket){ 
    // Everytime user is connected, I will do some Database operation to store the socketId, it will look something like this 
    user.socketId = socket.id; // For simplicity. 

    console.log(socket.request.user.username); // is using passport-socket.io library 
    socket.on('friendsRequest', function(data) { 
    // Got these two datas from input hidden on html by using Jquery 
    var socketId = data.socketId; 
    var userId = data.userId; 
    socket.to(socketId).emit('friendsRequest', socket.request.user); 
    console.log("Successful" + " from " + socket.request.user.username); 
}); 

Странная вещь, на ServerSide она всегда показывает console.log("Successful" + " from " + socket.request.user.username); смысл, если нажать на кнопку браузера Оба пользователя он будет показывать правильно

"Successful from UserA" 

"Successful from UserB" 

Но проблема на стороне клиента, целевой HTML никогда не изменял , это всегда один из glyphicon браузера в NavBar будет увеличиваться

Вот код на стороне клиента

// This event will send the targeted data like socketId and userId back to the server 
    $(document).on('click', "#addFriend", function(e){ 
     e.preventDefault(); 
     var userId = $('#userId').val(); 
     var socketId = $('#socketId').val(); 
     socket.emit('friendsRequest', { 
     userId: userId, 
     socketId: socketId 
     }); 
    }); 

    // Once the server has done doing his job, this event will listen. 
    socket.on('friendsRequest', function(data) { 
     var totalRequests = parseInt($('#totalRequests').html()); 
     console.log(totalRequests); 
     totalRequests += 1; 
     $('#totalRequests').html(totalRequests); 
     $('#friendsRequested').append('<li>' + data + '</li>'); 
    }); 

Основная проблема на стороне клиента socket.on('friendsRequest');

Он работает только один из браузеров, но не как в то же самое время, когда я запустил событие friendsRequest

Нужен человек с опытом Socket.io, чтобы объяснить мне почему это не работает в обоих направлениях. Что касается моей логики, то она должна работать.

HTML

<input type="hidden" name="socketId" id="socketId" value="ValueOftheSocketId" /> 
<button type="submit" id="addFriend" class="btn btn-default">Add Friend</button> 

ответ

0

Если событие 'friendsRequest' не будоражила ошибка будет всегда, когда вы испускают его на сервере:

socket.to (socketId) .emit ('friendsRequest', socket.request.user);

Возможно, что socketId неверен, почему? :

Сокет socket.id сбрасывается при повторном подключении. Так что, вероятно, это приведет к тому, что вы выполните: socket.to (socketId) .emit ('friendsRequest', socket.request.user); отправлен любой.

Повторное подключение может произойти, если ошибка возникает внутри прослушивателя событий на клиенте (он не появится на консоли).

Так что для часов, если это произойдет, вы можете использовать событие по умолчанию «разъединение» на сервере:

socket.on('disconnect', function() { 
    console.log('user disconnected'); 

    }); 
+0

Я уже реализован socket.on («разрыв»), и я сделал сохранить socket.id в пользовательской базы данных для последующего использования. Но когда я обновляю, это просто не будет работать в обоих направлениях. –

+0

Я считаю, что это проблема с повторным подключением? –

+0

Я думаю, что это нехорошая идея, сохранить socket.id в db, когда вы обновите сокет, получите новый идентификатор –

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