游戏发芽网的在线聊天功能

作者:半瓶墨水   链接:http://www.2maomao.com/blog/youxi-fayaa-chat-online/

=====================================
插播一则广告

发芽网华容道精装版App发布啦(iPhone和iPad版), 点击查看
https://itunes.apple.com/cn/app/fa-ya-wang-hua-rong-dao-jing/id599917734

还是一样的精装版,一样的过关记录回放,精致的过关特效,方便的操作,精美的配乐。
包含发芽网华容道在线版的所有布局以及许多首手机程序独有的布局。
=====================================

游戏发芽网的在线聊天

孤单是不爽的,孤单的人是可耻的

所以当有一个人在玩智取华容道的时候,只有一个人玩,很快就会丧失兴趣。
但是如果打着打着,旁边有个信息说:嫣然一笑网友闯过了华容道的第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 条评论 发表在“游戏发芽网的在线聊天功能”上

  1. 张沈鹏说道:

    http://zsp.javaeye.com/blog/233795
    看我这篇文章 可以节省一个变量

    http://code.google.com/p/eurasia/wiki/Eurasia3Book
    用这个可以长连接

  2. 张沈鹏说道:

    3. 每次check之后,根据当前的timetag和每个消息的timetag做差值

    算一次就够了,然后用本地时间+diff

  3. 半瓶墨水说道:

    @张沈鹏 呵呵你是说一次算出本地和server的差就行,以后就用这个差值?
    不错这样就不用每次都加timetag了。

留下回复