用过RaceChat吗?华军软件园有,可以反编译来瞧瞧。

解决方案 »

  1.   

    首先思路都不对,用户发的消息应该存在服务器里(其实用jsp很方便的,存在application变量里),由客户端定时刷新显示就可以了
      

  2.   

    这样聊天室的响应就会变慢,要是刷新的快的话屏幕就会闪,看着很不舒服。
    这样对会使聊天室不好用。还是推信息到客户端,最少客户端感到舒服,而且是实时的。每秒钟10000条信息,服务器就不看重负了吗?我也想知道,结果会怎么样?不过,163,china都是用的推技术做的。
      

  3.   

    163用irc改的
    大家都说让客户端自己去取,我觉得未必。
    这种思路主要是沿袭了以往做web chat的经验,毕竟http协议是无状态协议,服务器无法主动“推”送数据给客户端,所以造成只能让客户端采用种种方式比如定时刷新或者xmlhttpget和remotescript等方式来“刷新”数据。
    这样难道服务器负载就小么?
    比如说1000个人同时在线,一秒钟刷新一次:如果一秒钟之内没有人发言呢?WebServer要接受1000个request...如果没有采用http 1.1的keep alive,那样对WebServer来说就是1000个Socket请求...网易早先用IRC来做聊天室,后来据说使用java改了服务器端。想必是用hashset一类的collection来保存数据的。不过你可以采用一些cache机制,例如把半秒钟内更新的数据放在buffer中,定时向collection中的人发一次数据,而不是每次有更新都发。我所知道的和推荐的,做这样的应用还用c比较好--如果你的需求中对效率问题比较敏感 x]btw, 所谓的“推”技术,早先是一班不懂socket编程,从web开始进入编程领域的“程序员”提出的概念,所以造成后来的很多误解。
      

  4.   

    对了,关于“组播”和聊天室方面的内容,推荐了解一下IRC协议,参考:RFC1459。里面对于多个聊天服务器之间的交互模型作了一些不错的设计和建议。IRC有20年左右的发展历史,国外有很多源代码,不妨看看。
      

  5.   

    谢谢各位的高见,我标题上说的是聊天室信息,其实聊天室只是我们现在做的在线游戏的一部分。
    游戏中会有许多需要群发的信息,例如某个用户退出大厅、改变积分等等,而且这类控制信息会比较频繁,所以我才考虑效率问题的。
    我这几天也了解了这方面的一些资料,感觉piggybank说的方法应该是比较适合我们使用的吧:)
    就是建立一个cache,信息并不是立即推向用户,而是积攒到固定时间或者固定条数时再推向用户。把要积攒到的信息条数设置成可配置的,这样就可以根据游戏实时性要求来调整这个数字了。