你在谈论两种完全不同的方法-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)。
我觉得这个主题还有很多要说的,但现在我无法用言语表达 - 我可能会在某个时候扩展这个答案。