游戏发芽网的在线聊天功能
孤单是不爽的,孤单的人是可耻的。
所以当有一个人在玩智取华容道的时候,只有一个人玩,很快就会丧失兴趣。
但是如果打着打着,旁边有个信息说:嫣然一笑网友闯过了华容道的第31关,用了120步。
(华容道过关记录一千多,嫣然一笑一个人搞定了其中的500,真不是一般的有恒心)
这样就不会觉得孤单了吧(只是猜想,我自己忙着开发来着,没怎么玩)
更进一步,你看到有人在和你访问同一个网页,是不是想和他/她交流一下呢。。。
好吧,说了这么多,就是因为:
游戏发芽网的在线聊天系统上线啦!!!
打开华容道游戏、过关记录播放等页面,你就可以在线聊天了。
(匿名用户暂不可以参与,只能看到聊天记录)
呃。。。人不多。。。先自说自话吧。。。
————————实现细节的分割线————————
在线聊天有一点点特殊,因为是web服务器和普通的HTML浏览器,
从服务器端向普通的客户端Push的方式(没有java applet / activeX 的)通信做不到
所以只有靠Pull的方式,即服务端不管session的事情,依赖一个个的post和客户端频繁的get来做消息同步
这样实现起来也很简单:
1. web server端处理两种消息:
一种是用户发消息过来,录入数据库即可
另一种是用户接收最新的消息(比如:编号为888的以后的10条消息),查数据库返回即可
2. web client浏览器端处理两种消息:
一种是用户发言,这时候需要组装一个Post消息发给web server
另一种是循环获取最新的消息列表,每次都记录下最新的获取时间方便下一次查找最新的
用到的javascript很简单,打开游戏发芽网找到源码里的youxi.js就能看到
下面说一下遇到的问题,即
时间同步问题:
1. 服务器端记录的时间是22点,是当地时间,比如说是英国
2. 客户端时间可以有很多,中国的,美国的,都有可能
3. 问题就出现了:客户端到底是显示本地的呢还是server的呢?
答案应该很明显,显示本地的。但是直接显示时间看不清楚,所以我考虑实现显示“人性化”的时间
比如,“3分钟以前”, 而不是僵硬的2008年11月19日下午3:08
好的,第二个问题出现了:聊天的过程中,显示的人性化时间需不需要更新呢?
比如一个“3分钟以前”的消息在下一分钟应该变成“4分钟以前”
哎呀,这回用本地的和server的时间差就引起问题了:
本地得到的时间并不是server上生成的时间,server上的时间和本地时间算时间差又没有意义
最后我找到了一种至少目前看起来可行的方案:
1. 每个消息在送到客户端的时候都会有个timetag,是距离1970年1月1日的秒数(熟悉事件处理的应该知道这个时间点)
2. 每隔一段时间(我设置的是5秒钟),在check服务器端有没有新的消息的时候,同时返回server的当前timetag
3. 每次check之后,根据当前的timetag和每个消息的timetag做差值
(张沈鹏:这步并不必要,实际上只要计算一次server端与本地的差值就够了。不过懒得改了,放着吧)
然后再加上一些简单计算转化成比较易读的时间,这样就可以搞定了。
直到想去深入一个问题的细节的时候,才发现所需要的时间不是想象的那么少。
直到勇于开始并解决掉一个问题的时候,才发现这类问题没有想象中那么难。
共 3 条评论
发表评论
Additional comments powered by BackType




http://zsp.javaeye.com/blog/233795
看我这篇文章 可以节省一个变量
http://code.google.com/p/eurasia/wiki/Eurasia3Book
用这个可以长连接
3. 每次check之后,根据当前的timetag和每个消息的timetag做差值
算一次就够了,然后用本地时间+diff
@张沈鹏 呵呵你是说一次算出本地和server的差就行,以后就用这个差值?
不错这样就不用每次都加timetag了。