讨论:使用node.js创建聊天服务器,HTTP还是TCP?

11

我在考虑使用node.js/socket.io做一个聊天服务器。我应该将它做成TCP服务器还是HTTP服务器?我想TCP服务器会更有效率,但是是否可以向其发送其他内容,例如文件附件等?如果TCP更有效率,那么效率会提高多少?此外,我想知道一个node.js服务器可以处理多少并发连接?做TCP和HTTP哪个更费力?

2个回答

25
你在谈论两种完全不同的方法-TCP是传输层协议,HTTP是应用层协议。HTTP(通常)在TCP上运行,所以无论你选择哪个选项,它仍将在TCP上运行。
效率问题有点无关紧要,因为你正在谈论不同的OSI层。如果你选择原始TCP套接字,你的解决方案可能会更有效-至少在带宽方面,因为HTTP包含了很多额外的数据(标题),这些数据可能与你的目的无关(取决于聊天程序的规模)。你正在开发自己的应用层协议。
你可以通过TCP发送任何你喜欢的东西-毕竟HTTP可以发送附件,并且它在TCP上运行。FTP也在TCP上运行,专门用于传输“附件”。为了做到这一点,你需要编写自己的协议,使其能够告诉远程方以下数据是文件,然后发送文件数据,然后告诉远程方传输完成。这样的实现方式多种多样(HTTP方法与FTP方法完全不同),你的选择几乎是无限的。
我不确定node.js连接限制,但我可以相当有把握地说它受操作系统的限制。 可能会帮助你理解那个问题的答案。
这是一个有争议的话题,无论是使用TCP还是HTTP都需要大量工作。我可能更倾向于选择TCP选项作为最佳选择。虽然TCP需要你设计协议而不是/和应用程序,但HTTP并不特别适合像聊天服务器这样的实时双向应用程序。有许多使用AJAX的基于HTTP的聊天实现,但我可以告诉你,从痛苦的经验来看,它们非常麻烦。
我认为,如果你打算将终端点(即客户端)设置为浏览器,则应仅查看HTTP。如果您要为终端点编写桌面应用程序,则直接使用TCP链接肯定是正确的方法。这主要是因为HTTP以请求-响应方式工作,其中客户端向服务器发送请求,服务器响应。通过TCP,您可以打开单个TCP流,可用于双向通信。这意味着服务器可以立即将事件推送到客户端,而在HTTP上,您必须等待客户端发送请求,以便您可以响应事件。如果您打算使用浏览器作为客户端,那么整个文件传输过程会变得更加棘手(至少是发送部分)。
有一些使用长轮询和服务器推送(阅读此处)的方法可以在HTTP上实现此操作,但实现起来可能非常麻烦。
如果您要在局域网上(甚至可能在互联网上)实现此功能,则值得考虑UDP而不是TCP - 在聊天应用程序中,通常并不绝对关键消息以正确顺序到达,即使确实如此,用户也可能无法打得比网络延迟变化更快(可能小于100毫秒)。然后,对于文件传输,您可以协商一个单独的TCP套接字进行数据交换(例如FTP),或者实现某种UDP ACK系统(例如TFTP)。
我觉得这个主题还有很多要说的,但现在我无法用言语表达 - 我可能会在某个时候扩展这个答案。

你知道如何在Node.js/Socket.io客户端使用TCP吗?我也在这里列出了这个问题:http://stackoverflow.com/questions/7340475/client-side-tcp-with-node-js-socket-io - Derek
顺便说一句,非常感谢您的解释,对我帮助很大。不过,您能否再详细解释一下UDP及其与TCP相比的优缺点呢?非常感谢! - Derek
UDP数据包丢失会影响聊天应用吗? - Derek
1
数据包丢失可能会影响应用程序,而在使用UDP时情况会更糟,因为另一端不知道数据包已经丢失。这取决于您打算部署的位置 - 在局域网场景中,您不需要太担心它,在互联网上则更为重要。 - DaveRandom
1
UDP相对于TCP的主要优势在于:数据包尺寸更小,没有SEQ/ACK所以通信量更少,并且具有组播/广播能力。主要缺点是如果数据包丢失,除非你自己设计序列系统否则将无法得知。TFTP通过UDP运作并提供自身的序列系统来确保另一端按正确顺序将数据重新组合,而且使用的带宽比FTP(TCP)还要少,但不建议在互联网上使用。 - DaveRandom
我不太擅长node.js,但我对javascript还算熟练,这是我一直想玩玩的东西,但从未实际着手。上面提到的信息更多地涉及TCP和HTTP之间的一般关系,无论你使用什么语言都适用。 - DaveRandom

2

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接