`
xielingjiang
  • 浏览: 32892 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

node js: node chat

阅读更多

server.js

 

有几个关键变量

1. channel

有messages和callbacks两个数组,分别用来存放消息列表和被挂起的客户端列表(也就是说等待取新消息的客户端,这些客户端还在等待响应)

有appendMessage和query两个操作方法,分别用来添加新消息到消息列表和查询新消息发给各个客户端列表

有一个定时任务setInterval,用来清理客户端列表里面30秒没有来服务器query消息的客户端,也就是说连接断开后30秒才能判断无效,不过程序里面貌似有个bug,就是说如果每次客户端来去消息的时候如果没有消息才刷新一下客户端列表,如果每次来取message的时候都有新message的话,客户端列表就无法刷新,也就是说30秒的新消息就可以剔除所有挂起的客户端,虽然这样情况很少见,但是高并发的情况下还是有可能的。值得注意的是这个30秒的挂起时间必须小于这个客户端session的超时时间,要不然,即使有新消息来的时候,条用callback的时候会出错,因为连接已经被断开释放了,(下面的session里面的destroy方法会在60秒的时候给客户端发送断开消息来结束当前的callback)

2. sessions

维护客户端会话列表,有一个createSession方法,用于新的连接加入会话列表,一个定时任务,用来定时清理60秒没有动作的客户端,不过我想这个时间应该跟上面的callbacks列表保持同步才好,

其中每个session包含nick,id, timestamp信息,poke和destroy两个方法。

3. 定义客户端请求处理路由

有who请求,用来查询所有sessions里面的客户端列表

有join请求,用来加入sessions列表,并发送一条加入消息到messages列表

有part请求,用来断开连接,并发送一条离开消息到messages列表

有recv请求,我觉得应该叫tryToGetMessage比较好,用来给客户端查询最新消息的,并刷新sessions列表,主要是条用channel的query方法,但是query方法有个特点,就是如果没有新消息,那么客户端的请求就会被挂起,最多会让客户端等待30秒才能返回一个空消息回去,让客户端进行下一个请求。这个在client.js里面的ajax调用配合了,一般默认ajax的超时时间肯定长于这个30秒,所以连接不会很平凡

有send请求,用来接收客户端发送过来的一条新消息,并刷新当前session。

 

client.js

 

主要方法

1.连接和断开

很简单,直接调用join请求和part请求,其中part请求被绑定在页面的unload事件,但是unload在浏览器crash的情况下就无法调用了,这个有待完善

 

2. longPool

首先检查是否需要重连,即showConnect状态,connect按钮又可以点击了

检查是否第一次连接,如果是的,条用who请求,得到客户端列表,显示在所有在线列表中

ajax调用recv请求,得到最后一次取消息到现在为止的新的消息列表,第一次的话取所有消息

 

很简单吧,符合正常逻辑

 

3. send

发送消息很简单,直接条用send请求,输入框绑定了keypress请求,如果是回车(keyCode是13),那么把输入文本框的内容发送给服务器。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics