Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查朋友是否在线_Javascript_Node.js_Express_Socket.io - Fatal编程技术网

Javascript 检查朋友是否在线

Javascript 检查朋友是否在线,javascript,node.js,express,socket.io,Javascript,Node.js,Express,Socket.io,我正在使用Socket IO创建一个类似于whatsapp的消息web应用程序,但是我在检测联系人列表中的用户是在线还是离线时遇到了问题 我已经实现了一个名为“new user”的函数,每次新客户端连接到服务器时,它都会将它们添加到一个数组中,然后将其广播到所有客户端,然后客户端在所有数组中循环,并检查其联系人列表中的联系人,以确定其是否在线 问题是,想象一下,如果有50.0000个用户正在连接和断开连接。所有客户每次都必须更新并比较所有在线用户及其联系人列表。这听起来是一种非常低效的方法 有什

我正在使用Socket IO创建一个类似于whatsapp的消息web应用程序,但是我在检测联系人列表中的用户是在线还是离线时遇到了问题

我已经实现了一个名为“new user”的函数,每次新客户端连接到服务器时,它都会将它们添加到一个数组中,然后将其广播到所有客户端,然后客户端在所有数组中循环,并检查其联系人列表中的联系人,以确定其是否在线

问题是,想象一下,如果有50.0000个用户正在连接和断开连接。所有客户每次都必须更新并比较所有在线用户及其联系人列表。这听起来是一种非常低效的方法

有什么想法吗

服务器:

socket.on('new user',函数(数据,回调){
if(昵称中的数据){
回调(假);
}否则{
回调(true);
socket.昵称=数据;
昵称[套接字.昵称]=1;
console.log(“已连接”+socket.昵称);
updateNickNames();
}
});
socket.on('disconnect',函数(数据){
如果(!socket.昵称)返回;
删除昵称[套接字.昵称];
console.log(“断开连接”+套接字.昵称);
updateNickNames();
});
函数updateNickNames(){
io.sockets.emit('usernames',昵称);
}
客户端:

socket.on('usernames',函数(数据){
for(数据中的变量用户名){
对于(变量i=0;i
“有什么想法吗?”关于如何创建可扩展的聊天系统?是的,有一些。你对一种编程语言或一段代码有什么特别的问题吗?你真的会有50万用户吗?听起来你的客户机/服务器关系颠倒了。仅当客户端发出请求时才向客户端提供内容。为什么每次更新时都需要广播整个阵列?为什么不直接广播改变状态的单个用户?当用户联机时,如果您计算该列表很容易/便宜(可能是的,即使在大规模情况下),您只能将消息发送到作为联系人的已连接用户的套接字。另一个选择是让每个用户定期进行投票,询问“现在谁是我的在线联系人?”,但在这种情况下,为什么要使用套接字框架呢?