用于客户端/服务器通信的套接字而不是 ajax
Posted
技术标签:
【中文标题】用于客户端/服务器通信的套接字而不是 ajax【英文标题】:sockets instead of ajax for client/server communication 【发布时间】:2013-12-15 16:32:30 【问题描述】:在这个 node.js 论坛应用程序https://github.com/designcreateplay/NodeBB 中,它允许您关注站点上的其他用户,我注意到它似乎使用套接字来传达我本来希望通过 ajax 发布请求传达的信息。例如,当您单击按钮关注另一个用户(此论坛软件允许)时,客户端上的套接字会发出一个 '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);
);
【问题讨论】:
【参考方案1】:NodeBB 不使用 sockets:它使用 Socket.io,这是一个库,可让您在浏览器和服务器之间使用“实时”通信。
您可以在互联网上轻松找到 AJAX 与 Socket.io 的比较,但这里有一些区别:
Socket.io 在客户端和服务器之间使用一个持久连接;而每个 AJAX 请求都使用一个新连接,这意味着发送冗长的 HTTP 标头、cookie 等。 Socket.io消息不能缓存,AJAX请求可以 Socket.io 提供命名空间、易失性消息、广播...在论坛的特殊情况下,使用 Socket.io 的主要优势是提供实时功能,例如在线程上即时显示新消息,这些消息会自动从服务器推送到客户端。如果某些消息可以使用 AJAX 发送(例如关注用户),我想开发人员不想引入使用两种不同技术在客户端和服务器之间进行通信的心理开销,因为 Socket.io 也可以处理那些消息就好了。
编辑: 正如 cmets 中所指出的,Socket.io 会根据浏览器选择传输协议。 Websocket 是首选,但如果需要,它可以切换到 AJAX 长轮询或 iframe。
【讨论】:
Socket.io 只是一个使实时通信工作更容易的库。当支持时使用套接字(特别是 WebSockets),它确实如此,尽管它有时使用 AJAX 轮询以及其他方法。以上是关于用于客户端/服务器通信的套接字而不是 ajax的主要内容,如果未能解决你的问题,请参考以下文章
用于移动客户端/服务器应用程序的基于套接字与 HTTP 的通信
关于socket通信UDP协议的问题,在客户端client下创建两个套接字s、s1分别用于recvfrom()和sendto()。