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

Der*_*rek 11 tcp http websocket node.js socket.io

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

Dav*_*dom 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,您必须等待客户端发送请求,因此您可以响应事件.如果您打算使用浏览器作为客户端,它将使整个文件传输更加棘手(至少发送).

有很多方法可以通过使用长轮询和服务器推送来实现这一点(阅读本文)但实现起来真的很麻烦.

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

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