讨论:通过node.js聊天服务器:HTTP还是TCP?

时间:2011-09-07 22:10:36

标签: http node.js tcp websocket socket.io

我正在考虑使用node.js / socket.io做一个聊天服务器。我应该将其设为tcp服务器还是http服务器?我想tcp服务器会更有效率,但你可以像文件附件一样发送其他东西吗?如果tcp效率更高,那还有多少呢?还想知道一个node.js服务器可以处理多少个并发连接?做TCP或HTTP更多的工作吗?

2 个答案:

答案 0 :(得分:25)

您在谈论两种完全不同的方法 - TCP是传输层协议,HTTP是应用层协议。 HTTP(通常)通过TCP运行,因此无论您选择哪个选项,它仍将通过TCP运行。

效率问题有点问题,因为你在谈论不同的OSI layers。如果您使用原始TCP套接字,您的解决方案可能会更有效 - 至少在带宽中 - 因为HTTP包含一大堆额外数据(标题),这可能与您的目的无关(取决于聊天的规模)程序)。你在谈论开发的是你自己的应用层协议。

您可以通过TCP发送任何您喜欢的内容 - 所有HTTP都可以发送附件,并且可以通过TCP进行操作。 FTP也可以通过TCP运行,它纯粹是为了传输“附件”而设计的。为此,您需要编写协议,以便能够告诉远程方以下数据是文件,然后发送文件数据,然后告诉远程方传输完成。这方面的实现是多种多样的(HTTP方法与FTP方法完全不同),您的选择几乎是无限的。

我不确定node.js连接限制,但我可以相当自信地说它受操作系统的限制。 This可能会帮助您解决该问题的答案。

使用TCP或HTTP进行更多的工作是值得商榷的 - 在两者中都要做很多工作。我可能更倾向于将TCP选项作为您最好的选择。虽然TCP要求您设计协议而不是/和应用程序,但HTTP并不特别适合实时的双向应用程序,如聊天服务器。有许多使用AJAX的HTTP聊天实现,但我可以从痛苦的经历告诉你,它们是后端的完全痛苦。

我想说,如果您打算将端点(即客户端)作为浏览器,那么您应该只关注HTTP。如果您要为端点编写桌面应用程序,那么直接TCP链接肯定是可行的方法。其主要原因是HTTP以请求 - 响应的方式工作,客户端向服务器发送请求,服务器响应。通过TCP,您可以打开单个TCP流,可用于双向通信。这意味着服务器可以立即将事件推送到客户端,而通过HTTP,您必须等待客户端发送请求,因此您可以响应事件。如果您打算使用浏览器作为客户端,它将使整个文件传输更加棘手(至少发送)。

有很多方法可以使用长轮询和服务器推送(read this)通过HTTP实现这一点,但实现起来真的很麻烦。

如果你要在局域网上(甚至可能在互联网上)实现这一点,那么值得考虑使用UDP over TCP - 在聊天应用程序中,消息以正确的顺序到达通常并不是绝对关键的任务,甚至如果是,用户可能无法比网络延迟的变化(可能<100ms)更快地打字。然后,对于文件传输,您可以协商单独的TCP套接字进行数据交换(如FTP),或者实现某种UDP ACK系统(如TFTP)。

我觉得关于这个问题还有很多话要说,但现在我不能说出来 - 我可以在某个时候扩展这个答案。

答案 1 :(得分:2)

聊天服务器是节点中的Hello World程序。使用http。

至于它可以处理多少并发连接的问题,这一切都取决于您的系统。设置一个简单的聊天服务器,然后尝试对其进行基准测试。

另外,请查看http://search.npmjs.org/并搜索chat以获取一些指示。