我目前的问题是有两个浏览器(两个用户)。一旦它们都连接起来,它们就可以执行某个套接字事件,这是一个朋友请求但不能同时进行。始终需要刷新用户的一个页面。
说明性
当用户点击此按钮时
导航栏glyphicon将增加1
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>
答案 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');
});