话说很久很久以前有个人,他的名字叫paperen,他一直想弄一个聊天工具……而又在同时他不知不觉间步入了WEB的领域,但他依然想弄个聊天工具……于是直到这篇Just For Fun的面世……

一个很囧的引子……其实呢,paperen我在毕业之前就弄了一个,那时打算将它作为毕设的,但结果用了那时在诺网期间那个IP屏蔽的东西作为自己的毕设~~这次再弄了一个,纯属是弄着玩而已,不过也花了些少功夫,代码架构上就一般般,并没有太多面向对象的味道,其实一开始是想发表一个关于在线的东东,结果弄着弄着就加上了聊天对话的东西……下面放出DEMO与RAR包的地址(如果你想做得更好,paperen可以说我这个还远远不够~~但这并不影响你去实现你想实现的更cool的东西):

DEMO paperen.com/demo/just-for-fun/

RAR打包 paperen.com/demo/just-for-fun/just-for-fun.rar

20110420205051

关于聊天与在线记录paperen我是用了sqlite数据库(其实就是一个文件,类似access数据库),好在空间的php有相应的支持。

paperen在此并有打算说任何关于代码的东西~~因为那个不是最重要的,没有思路即使你懂所有php的内置函数也没有用,paperen只想提提其中的思路而已。

First!从在线开始,问下自己到底web应用是如何判断用户在线或者不在线的?

目前的WEB应用(可以认为就是网站)都是一种请求-响应的模式,浏览器为你向网站服务器发出请求,服务器找到文件并解析完将一大堆文本送回给浏览器,浏览器进而去解析这些文本,最后呈现给用户看。可以看到浏览器不是总与服务器存在交流的,正如服务端响应完毕这个过程就已经完毕,换言之,判断用户是否在线的唯一线索在:用户在第一次请求后会否向服务器做出第二次,第三次请求……第N次,是否可以这样认为,如果在一定时间范围内用户不再次请求的话就被当作是不在线了,即使你仍停留在该网站的某个页面上,这种方法貌似有点说不过去,因为理论上我不在线应该是我离开了你的网站或者关闭了浏览器(相对于如果浏览器仍显示着该网站页面但因为不继续与服务器响应就被当作不在线的这种情况而言),是的,这不是绝对上的在线/不在线的判断方法,但基于这种主从式的模式,这确实只能这样做(至少paperen也是这么认为的),服务端不能主动地与之前向自身发出请求的客户端进行联系,所以也就不能主动地判断客户端的在线情况,只有使用时间来判断用户是否在线。

每次用户刷新页面或者点击网站上的链接,都会导致浏览器发出一次请求,而就在这次请求中更新该用户的时间就可以了,我们将2分钟作为判断在线/不在线的依据,每次用户请求时将当前时间记录下来,那么过了5分钟后再获得当前时间。

那么想知道谁在线就就将当前时间分别减去曾经记录的用户时间,若结果大于2分钟代表该用户离线,等于或小于表示在线,一般来说这个名词可以叫lastactivity。

如果你要求实时性很强的话而且又不想定时刷新整个页面就使用AJAX咯。

Second!其实聊天也是同样道理,因为是主从式的,所以也要隔一定时间向服务器发出请求并获取消息,而不是想象中的直接与聊天方通讯。

发觉还真没什么可以解析的,要解析的都在代码里面了。好吧,最后总结一下sync.php与msg.php的代码思路算了。

/* 
* sync.php
* 同步在线状态
*
* 引入配置文件
* 获取动作参数与当前用户ID
* 如果存在uid
* 初始化数据库链接
* 如果是更新用户活动时间
* 有过往记录更新时间
* 没有插入记录
* 删除过时记录
* 获取在线用户信息
*
*/
/*
* msg.php
* 消息
*
* 引入配置文件
* 获取动作参数与当前用户ID
* 如果是消息发送动作
* 单纯的处理数据并插入
* 如果是获取消息动作
* 删除过期消息
* 获取关于用户的对话信息
*
*/

在代码里面也有在头部写上这些思路的,或者这也算是一个好习惯,不妨在自己写代码过程中也这样做试试。啊,对了,这个小DEMO让paperen发现原来自己一直以来都搞错了一个单词perfix应该是prefix才对……囧rz。

So far so good,希望你喜欢这个Just-For-Fun,能让你也想玩两手。