node.js - 使用套接字代替ajax进行客户端/服务器通信

标签 node.js sockets

在此node.js论坛应用程序中https://github.com/designcreateplay/NodeBB ,它允许您关注网站上的其他用户,我注意到它似乎使用套接字来传达我本来希望通过 ajax post 请求传达的信息。例如,当您单击按钮关注另一个用户(此论坛软件允许)时,客户端上的套接字会发出“api:user.follow”事件,然后在服务器上监听该事件,如下所示。

你能解释一下为什么有人愿意或不愿意使用套接字而不是 ajax 来实现这种类型的功能吗?我认为各有利弊,但我不知道。

客户端

followBtn.on('click', function() {
                socket.emit('api:user.follow', {
                    uid: theirid
                }, function(success) {
                    if (success) {
                        followBtn.addClass('hide');
                        unfollowBtn.removeClass('hide');
                        app.alertSuccess('You are now following ' + username + '!');
                    } else {
                        app.alertError('There was an error following' + username + '!');
                    }
                });
                return false;
            });

服务器

   socket.on('api:user.follow', function(data, callback) {

            if (uid) {
                user.follow(uid, data.uid, callback);
            }
        });

最佳答案

NodeBB 不使用套接字:它使用 Socket.io ,这是一个库,使您能够在浏览器和服务器之间使用“实时”通信。

您可以在互联网上轻松找到 AJAX 与 Socket.io 的比较,但这里有一些区别:

  • Socket.io 在客户端和服务器之间使用一个持久连接;而每个 AJAX 请求都使用一个新连接,这意味着发送冗长的 HTTP header 、cookie 等。
  • Socket.io 消息无法缓存,AJAX 请求可以
  • Socket.io 提供命名空间、 volatile 消息、广播...

在论坛的特定情况下,使用 Socket.io 的主要优点是提供实时功能,例如在线程上立即显示新消息,这些消息会自动从服务器推送到客户端。如果某些消息可以使用 AJAX 发送(例如关注用户),我想开发人员不想引入使用两种不同技术在客户端和服务器之间进行通信的心理开销,因为 Socket.io 也可以处理这些消息很好。

编辑:正如评论中所指出的,Socket.io 根据浏览器选择传输协议(protocol)。 Websocket 是首选,但如果需要,它可以切换到 AJAX 长轮询或 iframe。

关于node.js - 使用套接字代替ajax进行客户端/服务器通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20596859/

相关文章:

javascript - 重新启动 Node 时如何使 Node 检查器重新启动?

javascript - 为什么 Node.js 函数接受对象作为参数?

sockets - 同时使用 INADDR_ANY 和特定 IP 绑定(bind)到同一端口

java - 找不到 java.net 的符号

ruby - 删除 Ruby 中的最后一个 IP 地址八位字节

node.js - 如何通过流获取文件

node.js - 带有 upsert 的 Mongoose 重复键错误

javascript - Dart 语言比 JavaScript (Node.js) 有什么好处

python - 如何知道客户端在套接字中断开服务器连接

c - C 语言的多线程 TCP 服务器崩溃