- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在考虑使用 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,您必须等待客户端发送请求,以便您可以使用事件进行响应。如果您打算使用浏览器作为客户端,它将使整个文件传输变得更加棘手(至少发送)。
有一些方法可以通过 HTTP 使用长轮询和服务器推送 (read this) 来实现这一点,但实现起来可能会很痛苦。
如果您要在 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/
问题:您好,我已经为我的一个客户创建了一个 DBMS,其中有一个功能,即从相同的表单输入将值拆分为四个不同的表(但是)有时会发生值输入到 table1 和 table2 而不是 table3 和 ta
我正在开发基于 Web 的应用程序,该应用程序需要在将任何文件上传到服务器之前检查其大小。 如果 Web 开发人员可以通过任何方式在客户端检查文件大小而不是在服务器端检查文件大小,从而避免不必要的服务
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 5年前关闭。
好的,这个线程将更像是对标题中提到的主题的讨论。我一遍又一遍地搜索整个主题,但没有找到适合我的好/可接受的解决方案。 场景 假设我有一个 android 项目,我需要一个第三方库(例如 drag-so
我正在进行的项目使用用户创建的多个“墙”进行讨论。 我的问题涉及如何在 MySQL 数据库中对此进行建模。 拥有一个名为“walls”的表,其中包含诸如创建者等信息,以及另一个名为“messages”
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit th
发现了一个有趣的问题,我首先在 WinForms 中发现,然后在 Silverlight 中再次发现,而且在数据绑定(bind)方面也很可能是 WPF。 我有一个带有多个选项卡的选项卡控件。当用户点击
我正在用 VBA 编写一个方法,但我收到了 ByRef 参数类型不匹配。在做了一些研究之后,我找到了一个快速的解决方法——将我的值存储在另一个变量中,然后将该新变量传递给我的方法。谁能向我解释疯狂背后
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 7 年前。 Improv
我一直在尝试修改 Odoo 讨论,但没有成功。 这就是我要实现的目标: 我将带有“新消息”按钮的消息添加到 Odoo 模块(在类 mro.order 中)。消息显示在讨论模块中: 但我需要标题类似于“
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
为任何错误的术语道歉——我对计算机科学很陌生,我几乎只知道 Clojure(但我想我会说我很了解它)。 所以,我没有对此进行大量研究,但有时我发现在编写 Clojure 代码时它很有用,以便能够从该数
a) 匿名卷 使用数据容器时,您可以像这样使用匿名卷 version '2' services: consumer: volume_from: - data-container
var yourObjects = [ { object: {obj1:"aa"}, direction: 'top' }, { object: "obj2", direction: 'left' }
我正在尝试使用 Disqus API 将帖子添加到现有的讨论/论坛。在文档中我可以读到我可以作为访客发送评论而无需身份验证。文档是这样说的: http://disqus.com/api/docs/po
因此,我偶然发现了一本名为“C++科学计算指南”的C++书的练习。 这是练习: “编写代码,为三个2×2矩阵的 double 浮点数A,B,C动态分配内存,并为A和B的条目分配值。令C = A +B。
规则 CA1008指定所有枚举都应具有 0 值,该值应命名为 Unknown(我们不在此处讨论标志)。我理解您想防止未初始化的值自动获得意义的原因。假设我定义了以下枚举: enum Gender {
前几天,Google 通知我,我的 Gmail 帐户可能已被盗用,因为它已被两个来自异常位置的 IP 地址访问。由于我通常(并且愚蠢地)为每个网站使用相同的密码,所以我决定改变一下并使用不同的密码。
RubyGems.org ,官方 gems 站点,提供的功能很差。我想为我的网站找到一些好的 gems,但这是不可能的——它只提供了几个“新 Gems”/“今天下载最多的” gems,以及所有的列表
我如何提取我博客中的最新对话(整个网站)并显示最近的 10 条评论作为来自 Disqus 的对话摘要? 最佳答案 您可以使用 Disqus 论坛/listPosts API 方法构建一个最新评论小部件
我是一名优秀的程序员,十分优秀!