套接字而不是ajax进行客户端/服务器通信

在这个node.js论坛应用程序https://github.com/designcreateplay/NodeBB ,它允许你跟随网站上的其他用户,我注意到,它似乎使用套接字来沟通信息,我会被期望通过通信ajax发布请求。 例如,当你点击button关注另一个用户(这个论坛软件允许)时,客户端上的套接字就会发出一个'api:user.follow'事件,然后在服务器上被监听,如下图所示。

你能解释为什么有人会或不想使用套接字而不是Ajax来实现这种function? 我认为每个人都有优点和缺点,但是我不认识他们。

客户

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 ,这是一个库,使您可以使用浏览器和服务器之间的“实时”通信。

你可以很容易地find互联网上的AJAX与Socket.io比较,但这里有一些不同之处:

  • Socket.io在客户端和服务器之间使用一个持久连接; 而每个AJAX请求使用一个新的连接,这意味着发送冗长的HTTP标头,cookie等
  • Socket.io消息不能被caching,AJAX请求可以
  • Socket.io提供命名空间,易失性消息,广播…

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

编辑:正如在注释中指出的那样,Socket.io根据浏览器select传输协议。 WebSocket是首选,但它可以切换到AJAX长轮询或iframe,如果需要的话。