作者: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的更多相关文章

  1. Node聊天程序实例04:chat_ui.js

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. 这个程序在客 ...

  2. Node聊天程序实例03:chat.js

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. chat.j ...

  3. Node聊天程序实例06:server.js

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. server ...

  4. Node聊天程序实例05:index.html和style.css

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. index. ...

  5. Node聊天程序实例02:chat_server.js

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. chat_s ...

  6. WinSocket聊天程序实例(多线程)

    #pragma comment(lib,"Ws2_32.lib") #include <stdio.h> #include <Winsock2.h> SOC ...

  7. boost asio异步读写网络聊天程序client 实例具体解释

    boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  8. boost asio异步读写网络聊天程序客户端 实例详解

    boost官方文档中聊天程序实例讲解 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  9. Node.js + Web Socket 打造即时聊天程序嗨聊

    前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...

随机推荐

  1. chrome浏览器调试typescript

    在chrome的开发人员工具的配置项中,有一个sourcemap的选项,用来配置javascript源码和生成代码的关系. 如果能在浏览器中直接调试typescript代码,才能让我们真正体会到typ ...

  2. hduoj 1455 && uva 243 E - Sticks

    http://acm.hdu.edu.cn/showproblem.php?pid=1455 http://uva.onlinejudge.org/index.php?option=com_onlin ...

  3. android selector 开始自定义样式

    Selector的结构描述: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:a ...

  4. UIAlertController警告视图和操作表单

    //创建一个myAlert1操作表单对象(UIAlertControllerStyleActionSheet为操作表单,UIAlertControllerStyleAlert为警告视图) UIAler ...

  5. ios 缺少合规证明

    现在app上传到appStore的时候,项目中如果出现加密,状态栏是:缺少合规证明. 解决的方法是在Info.plist文件中添加:ITSAppUsesNonExemptEncryption 设置为N ...

  6. LDD3 字符设备驱动简单分析

    最近在看LDD3,理解了一下,为了加深自己的印象,自己梳理一下.我用的CentOS release 6.6 (Final)系统. 一.编写编译内核模块的Makefile 以下是我用的Makefile ...

  7. C#开发Windows服务 入门

    Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序. 服务可以在计算机启动时自动启动,可以暂停和重新启动而且 ...

  8. SQL Server 2008创建oracle链接服务器(心得)

    操作系统是32位的情况下,曾经没费太多时间创建好了到oracle的链接服务器.主要要点就是: 1.安装oracle精简客户端.当时我用的是版本比较低的“oracle9i310-客户端简化版”,安装好了 ...

  9. 巧用margin/padding的百分比值实现高度自适应(多用于占位,避免闪烁)

    本文依赖于一个基础却又容易混淆的css知识点:当margin/padding取形式为百分比的值时,无论是left/right,还是top/bottom,都是以父元素的width为参照物的!也许你会说, ...

  10. [转]html5音乐播放器

    http://files.cnblogs.com/files/xjyggd/html5music.rar import java.io.File;import java.util.ArrayList; ...