Node聊天程序实例01
作者:vousiu
出处:http://www.cnblogs.com/vousiu
本实例参考自Mike Cantelon等人的《Node.js in Action》一书。
本实例要实现如下一个聊天App。左上的“Winter”为显示的房间的名字。中间为聊天消息,斜体字为系统消息,非斜体为聊天内容。右侧为房间列表,点击房间名可以进入房间。在下方输入框输入内容后,点击“提交”则可以发送聊天信息,或者发送更改昵称和更换房间的指令。

整个程序的架构图如下:

文件目录结构如下所示:

其中,socket.io包提供了一些webSocket方法,它可以跟http服务器在同一个端口进行监听,socket服务器可以对用户的连接和事件以回掉函数的方式进行响应。
chat_server.js用socket.io写了一个聊天服务器,处理与聊天相关的事件。它有一系列变量来存储每个socket所对应的名字、房间号还有系统已占用的名字。在每个用户与其建立connection时,它用回调函数为这个用户赋一个名字和房间,然后为这个用户的每个socket设置一个回调。有的回调就对发出的用户进行响应,有的则需要对一批用户进行响应(比如有人进了他们的房间),就像下图所示:
chat_server监听 <--------- connect ---------- 用户上线
chat_server处理 <--------- socket.io --------- 用户界面命令(chat.js中的函数)
处理完毕 ----------- socket.io--------> 界面更新(chat_ui.js中的回调函数来处理)
----- (broadcast) socket.io --------> 一批用户的界面
chat_server监听 <-------- disconnect -------- 用户下线
这个chat_server同时对多个用户的connection进行相应,那会不会造成在多线程中经常出现的问题:给多个用户分配同一个名字呢?按我的理解是不会的,因为它是一个connection一个connection的处理,对一个用户的connection回调函数执行完前,另一个用户的包含在connection回调函数中的名字分配函数不会进入node队列。
chat.js中定义了向一个socket发送各种消息和指令的函数。
chat_ui.js定义了在界面加载完时执行的一个回调,该回调注册了:对于用户界面操作的相应函数 和 对于socket.io的响应函数。
index.html和style.css则提供了用户界面。
最后,server.js在3000端口进行监听和文件传输,默认传输index.html文件。它还有一个对于文件的缓存功能。然后启动了chat_server服务器。
除了对于功能的实现,对于这个实例的一个关注点就是,它是一个Node程序,因此很多地方是使用异步回调函数的方法来写的,会出现一个回调套一个回调,里面再套一个回调的写法,这值得写惯了传统程序的程序员进行注意。
对于这些文件中代码的具体内容,将在接下来的文章中做具体介绍。
Node聊天程序实例01的更多相关文章
- Node聊天程序实例04:chat_ui.js
作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. 这个程序在客 ...
- Node聊天程序实例03:chat.js
作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. chat.j ...
- Node聊天程序实例06:server.js
作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. server ...
- Node聊天程序实例05:index.html和style.css
作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. index. ...
- Node聊天程序实例02:chat_server.js
作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. chat_s ...
- WinSocket聊天程序实例(多线程)
#pragma comment(lib,"Ws2_32.lib") #include <stdio.h> #include <Winsock2.h> SOC ...
- boost asio异步读写网络聊天程序client 实例具体解释
boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...
- boost asio异步读写网络聊天程序客户端 实例详解
boost官方文档中聊天程序实例讲解 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...
- Node.js + Web Socket 打造即时聊天程序嗨聊
前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...
随机推荐
- CSS深入理解之overflow
CSS深入理解之overflow 前言 这是跟着张鑫旭重学CSS的overflow篇 基本属性 overflow有以下五个基本属性: 1.visible : 默认值,具体表现为,应用此属性后,子元素超 ...
- opencv 抠图联通块(c接口)
#include "stdio.h" #include "iostream" #include "opencv/cv.h" #include ...
- git commit 代码时提示: Warning: Your console font probably doesn‘t support Unicode.
git 提交代码是会遇到以下问题, git commit 代码时提示: Warning: Your console font probably doesn‘t support Unicode. If ...
- 2.1 C#的关键字
关键字是被C#规定了用途的重要单词.在visual studio中,关键字以蓝色字体显示.图中红色方框圈起来的就是关键字. 关键字 class ,这个关键字的用途是声明类.比如上面例子中,类名叫做Pr ...
- UVALive 7148 LRIP(树的分治+STL)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
- 随手编程---快速排序(QuickSort)-Java实现
背景 快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法.这种排序方式,在当时已经是非常快的一种排序了.因此在命名上,才将之称为"快速排序".这个算法是二十世纪的七 ...
- .net之工作流工程展示及代码分享(四)主控制类
现在应该讲主控制类了,为了不把系统弄得太复杂,所以就用一个类作为主要控制类(服务类),作为前端.后端.业务逻辑的控制类. WorkflowService类的类图如下: 该类的构造函数: public ...
- 整盘恢复黑苹果后,重新安装Win7,卡在正在启动
是这样的: GHOST整个黑苹果的镜像,然后恢复到Thinkpad e450c上,能启动,但是驱动不对,最主要是网卡驱动不了(据说) 然后重新分区,安装Win7 哦豁 卡在 正在启动windows 多 ...
- 设置 phoneGap/Cordova 3.4 应用程序启动动画闪屏 SplashScreen
当Cordova 程序打包并安装到手机中后,我们会发现启动程序时,会有数秒的黑屏现象,常见的解决方法则是设置闪屏后面. 这里以 Android 程序为例,介绍Cordova设置启动画面的方法. 1. ...
- HTML5学习小结
HTML5是用于取代1999年所制定的 HTML4.01和XHTML1.0标准的HTML标准版本.HTML5的第一份正式草案已于2008年1月公布:2012年12月,规范已经正式定稿.W3C计划在20 ...