2011-09-07 88 views
11

我正在考虑使用node.js/socket.io做聊天服务器。我应该让它成为一个tcp服务器还是一个http服务器?我想tcp服务器会更有效率,但你可以发送其他东西给它像文件附件等?如果tcp更高效,那还有多少呢?另外,只是想知道一个node.js服务器可以处理多少个并发连接?是做更多的工作来做TCP或HTTP?讨论:通过node.js聊天服务器:HTTP还是TCP?

回答

25

您在这里谈论2种完全不同的方法 - TCP是传输层协议,HTTP是应用层协议。 HTTP(通常)通过TCP进行操作,因此无论您选择哪个选项,它都将通过TCP进行操作。

效率的问题是一个有争议的问题,因为你在谈论不同的OSI layers。如果你使用原始的TCP套接字,你的解决方案可能会更有效率 - 至少在带宽方面 - 因为HTTP包含了大量额外的数据(头文件),这可能与你的目的无关(取决于聊天的规模程序)。你正在讨论的是你自己的应用层协议。

您可以通过TCP发送任何您喜欢的东西 - 毕竟HTTP可以发送附件,并且可以通过TCP进行操作。 FTP也通过TCP进行操作,并且纯粹是为了传输“附件”而设计的。为此,您需要编写协议,以便能够告诉远程方以下数据为文件,然后发送文件数据,然后告诉远程方传输已完成。它的实现有很多种不同(HTTP方法与FTP方法完全不同),并且你的选择几乎是无限的。

我并不确定node.js连接的限制,但我可以说有一定的信心,它受操作系统的限制。 This可能会帮助你解决这个问题的答案。

对于使用TCP还是HTTP来做更多的工作是值得商榷的 - 在两者中都需要做很多工作。我可能更倾向于选择TCP作为您最好的选择。尽管TCP需要您设计协议而不是应用程序,但HTTP并不特别适用于聊天服务器等实时的双向应用程序。有很多使用AJAX的HTTP聊天实现,但是我可以从痛苦的经历告诉你,它们在后端完全是一种痛苦。

我想说,如果您打算让端点(即客户端)成为浏览器,您应该只查看HTTP。如果您要为端点编写桌面应用程序,那么直接的TCP链接肯定会成为一种方式。主要原因是HTTP以请求 - 响应方式工作,客户端向服务器发送请求,服务器响应。通过TCP,您可以打开一个TCP流,可以用于双向通信。这意味着服务器可以立即将事件推送到客户端,而通过HTTP,您必须等待客户端发送请求,以便您可以响应事件。如果你打算使用浏览器作为客户端,它会使整个文件传输更棘手(至少是发送)。

有很多方法可以通过使用长轮询和服务器推送(read this)的HTTP实现这一点,但实现起来可能是一个真正的痛苦。

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

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

+0

你有什么想法如何做tcp与node.js/socket.io客户端?我也有这个问题列在这里:http://stackoverflow.com/questions/7340475/client-side-tcp-with-node-js-socket-io – Derek

+0

顺便说一句。谢谢你解释了很多。它的帮助很大。但是,你能解释一下udp及其优点/缺点,而不是tcp?非常感谢! – Derek

+0

udp数据包丢失是否影响聊天应用? – Derek

2

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

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

此外,检查出http://search.npmjs.org/和搜索chat几个指针。