我当时正在考虑使用node.js/socket.io做一个聊天服务器。我应该将其设置为tcp服务器还是http服务器?我以为tcp服务器会更高效,但是您可以将其他内容(例如文件附件等)发送给它吗?如果tcp效率更高,那么效率又高了多少呢?另外,只是想知道一个node.js服务器可以处理多少个并发连接?使用TCP或HTTP是否还要做更多的工作?
最佳答案
您在这里谈论的是两种完全不同的方法-TCP是传输层协议(protocol),HTTP是应用程序层协议(protocol)。 HTTP(通常)在TCP上运行,因此无论您选择哪个选项,它都仍将在TCP上运行。
效率问题是一个有争议的问题,因为您正在谈论的是不同的OSI layers。如果您使用原始TCP套接字,则解决方案可能会更有效-至少在带宽上有效-因为HTTP包含大量可能与您的目的无关的额外数据( header )(取决于聊天的规模)程序)。您所说的开发那里有您自己的应用程序层协议(protocol)。
您可以通过TCP发送任何您喜欢的东西-所有HTTP都可以发送附件,并且可以通过TCP进行操作。 FTP还通过TCP进行操作,其设计纯粹是为了传输“附件”。为此,您需要编写协议(protocol),以便它能够告诉远程方以下数据是文件,然后发送文件数据,然后告诉远程方传输已完成。它的实现是多种多样的(HTTP方法与FTP方法完全不同),并且您的选择几乎是无限的。
我不确定node.js的连接限制,但是可以肯定地说它受操作系统的限制。 This可能会帮助您掌握该问题的答案。
对于使用TCP还是HTTP进行更多的工作,这是有争议的-在这两种方法中都要做很多工作。我可能会更倾向于TCP选项,这是您最好的选择。尽管TCP需要您设计协议(protocol)而非应用程序,但HTTP并不特别适合实时2路应用程序(例如聊天服务器)。有许多使用AJAX的HTTP聊天实现,但从痛苦的经历中我可以告诉您,它们是后端的全部痛苦。
我想说的是,如果您打算将端点(即客户端)用作浏览器,则应该只查看HTTP。如果您要为端点编写桌面应用程序,那么绝对可以使用直接TCP链接。这样做的主要原因是HTTP以请求-响应方式工作,客户端将请求发送到服务器,然后服务器做出响应。通过TCP,您可以打开一个TCP流,该流可用于双向通信。这意味着服务器可以立即将事件推送到客户端,而通过HTTP则必须等待客户端发送请求,这样您才能响应事件。如果您打算使用浏览器作为客户端,它将使整个文件传输变得更加棘手(至少是发送)。
有多种方法可以使用长轮询和服务器推送(read this)通过HTTP来实现,但是实现起来确实很麻烦。
如果要在LAN上(甚至可能在Internet上)实现此功能,则值得考虑使用TCP上的UDP-在聊天应用程序中,消息按正确的顺序到达通常不是绝对关键的任务,即使它是,则用户键入的时间可能不会超过网络延迟的变化(可能小于100毫秒)。然后,对于文件传输,您可以协商用于数据交换的单独的TCP套接字(例如FTP),或者实现某种类型的UDP ACK系统(例如TFTP)。
我觉得在这个问题上还有很多话要说,但是现在我不能说出来-我可能会在某个时候扩展这个答案。
关于http - 讨论: Chat server via node. js : HTTP or TCP?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7341105/