简短的任务描述:我希望一个登录用户能够向另一个登录用户发送即时简短文本消息。该解决方案需要易于扩展,并且在带宽和服务器负载(以及$$)方面不需要过多的资源。
第一个想法是进行客户端轮询,但这个想法很快就被放弃了,因为它不符合可扩展性要求。所以,在那之后,我进入了研究,并涉及许多概念,包括套接字,node.js,xmpp。信息量有点压倒性,所以我希望得到一些建议,指出我正确的方向。希望有一些随时可用的托管解决方案。
@epascarello: 谢谢你的快速反应。我做了,但没有详细说明。在深入研究任何技术之前,我想知道这实际上是我需要的。
大多数例子都是关于即时聊天的,但我的要求有些不同。我不需要每个登录的用户都能看到一条消息,但只需要一个特定的用户,就像它的意思一样,而有可能会有10万用户登录...
@Saeed Neamati: 谢谢!是的,我非常了解两个客户端 - 服务器通信选项,并得出结论,拉动是不行的。我现在想要找到的是最具可扩展性(这是主要的先决条件)和(希望)易于实现推送选项。例如,套接字选项相对容易,但似乎由于服务器过载(或者我错了)它不能很好地扩展。 node.js(至少通过概念描述)应该更好,但我想得到一些确认。使用xmpp - 我甚至不确定它与我的任务有多相关以及如何处理它。
@andyuk: Andy谢谢,是的socket.io也是我在做研究时遇到的事情。据我所知,它需要一个需要在主机上运行的服务器模块。您知道是否有可能在任何服务器上运行或者我是否需要寻找专门的托管公司?由于某种原因,socket.io网站在我的电脑上无法运行(IE或FF)。
答案 0 :(得分:0)
您是否看过source code的nodejs chat.?
答案 1 :(得分:0)
看,您只有两个客户端 - 服务器通信选项。客户端启动请求(Web上的HTTP请求),称为拉模型(如客户端将请求拉出服务器),服务器响应该请求,或者服务器直接启动响应没有收到任何请求(网络上的HTTP响应),称为推送模型(就像服务器将数据推送到客户端)。
您所描述的轮询实际上是拉模型,实际上它需要服务器提供大量资源。
但另一方面,当您想使用推送模型时,您的服务器应该知道客户端。换句话说,我们知道HTTP(基于TCP / IP)是无状态协议,这意味着在每次请求之后,您的连接都会关闭,服务器会丢失您并忘记您。
如果您希望服务器知道客户端,则应保持连接打开。这通常通过一些HTTP标头来完成,例如 Keep-Alive 和连接。
但要做到这一点,你应该阅读Comet Programming。但是,这会降低您的可扩展性,因为连接和客户端之间的一对一映射会保持打开更多连接(为了更好地理解这一点,您可以将连接视为服务器的门。您占用的门越多客户端,其他客户端可以使用的越少。)
答案 2 :(得分:0)
结帐socket.io。如果浏览器不支持Web套接字,它将回退到下一个最佳传输技术。
源代码中甚至有chat example included。
至于您对可伸缩性的关注,node.js非常适合这种情况,因为它具有事件驱动,非阻塞性质。处理许多开放连接是Node的真正优势之一。
Plurk uses Node.js提供实时聊天功能,支持100k +用户。