socket io不是双向工作?

时间:2016-01-27 12:00:41

标签: node.js express socket.io real-time

我目前的问题是有两个浏览器(两个用户)。一旦它们都连接起来,它们就可以执行某个套接字事件,这是一个朋友请求但不能同时进行。始终需要刷新用户的一个页面。

说明性

enter image description here

当用户点击此按钮时

导航栏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);
});

奇怪的是,在服务器端,它始终显示console.log("Successful" + " from " + socket.request.user.username);,这意味着如果点击用户浏览器上的按钮,它将正确显示

"Successful from UserA" 

"Successful from UserB"

但问题是在客户端,目标html从未改变,它总是一个浏览器导航栏的glyphicon将增加

这是客户端的代码

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

1 个答案:

答案 0 :(得分:0)

如果活动的朋友请求&#39;不会被解雇,当你在服务器上发出它时总是会出错:

socket.to(socketId).emit(&#39; friendsRequest&#39;,socket.request.user);

可能是socketId不正确,为什么? :

重新连接时,socket.id会重置。所以当你这样做时可能会导致:socket.to(socketId).emit(&#39; friendsRequest&#39;,socket.request.user); 它被发送给任何人。

当客户端上的事件侦听器内发生错误时,可能会发生重新连接(它不会出现在控制台上)。

因此,如果发生这种情况,您可以使用默认事件&#39;断开&#39;在服务器上:

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

  });