聊天室
聊天是典型的实时、多用户应用。在当时IRC通过许多专有和开放的协议运行在不标准的端口上,现在在Node.js环境下,我们可以在标准的80端口上,实现这些聊天应用。
可以说聊天应用是体验Node.js优点最好的例子,聊天应用轻量化、高流量,数据密集型(计算和处理时间短,最简单做一次转发)、跨终端、也是学习Node.js绝佳的例子,它包含了大多数在一个典型的Node.js应用中用到的模式。
分析一下聊天室是如何工作的。
最简单的例子,在我们的站点上只有一个聊天房间,所用的用户采用一对多的形式交换消息。假设我们的房间里有三个已经建立连接的用户。
在服务端,我们有一个简单的Express.js的应用,它实现两个功能:1.当我们请求根目录时,它返回一个包含消息面板,用来发送消息的按钮,还有输入框的网页。2.一个websocket服务,监听新消息并发送给客户端。
在客户端,我们有一个监听两个事件的页面,其中一个监听发送按钮点击事件,获取输入框中的消息,并通过websocket发送到服务端,另一个事件监听websocket客户端新消息(这个消息来源于其他用户,服务端转发给所有在这个聊天房间的用户,并且客户端显示消息)。
当一个用户发送消息,会经过如下几步:
浏览器监听发送按钮点击,JavaScript处理事件,从输入框中获取消息内容,websocket发送消息。
服务端webSocket连接收到消息,通过使用broadcast方法,进一步将它转发给其他建立连接的用户。
所有用户通过客户端websocket收到了来自服务端的推送消息,客户端将得到的消息,追加到页面消息面板的适当位置。
这是最简单的例子了,如果你想让它更加健壮,你可以使用如Redis这样的高速缓存,或者更高级一点,用消息队列处理客户端的消息分发,并且建立更强大的连接机制,用来减少建立临时连接的损失,还可以为已经注册的用户保存离线消息。不管你是否能实现这些功能,Node.js的最基本的功能仍是处理事件和并发连接,并且保证用户体验的流畅性。