一个在线聊天功能,不使用Actionx插件,采用定时刷服务器内存的方式,不刷数据库。
思路是这样的,所有发送到服务器的信息都缓存到内存中,别人读时也是从内存读数据,达到一定数量后存到数据库中(或者其他处理方式)。服务器端定义两个静态链表,一个存储用户结构(UserList),一个存储聊天结构(ChatList)。
用户登录后在UserList中加入一个节点,用户Session超时后(或者用户主动注销),在Session_End事件中,移除对应的节点(根据Session(UserID),不知道这时候Session中的UserID清空了没),维护链表的移除操作。聊天时在ChatList中加入一个节点,页面用ajax方式,在服务器上通过ChatId找到对应的聊天结构,然后通过索引找到内容。(详细的处理可以再细化)我的感觉,整个web应用程序维护好这两个链表,基本就可以了。
大体的思路是这样的,不知道合理不合理,希望大家指正,谢谢。整个思路里,担心的是Session_End事件,能不能正确触发,Session里面的UserID是不是清掉了。原本的打算是开一个线程维护这两个链表的,后来发现还有Session_End事件,线程就省了(一直没做过web开发,做B/S的,同学接了个项目练练手)。
Google时很多地方说简单的web聊天xxx,我这里不会把简单的问题复杂化了吧。

解决方案 »

  1.   

    我之前也做过聊天的。但是在如何激活Session_End事件上卡壳了。楼主有没有好的办法,请教并且学习并且探讨
      

  2.   

    原来如此。我当时太执意于Session_End事件了。这个思路确实不错。
    不过我有个新问题,楼上的麻烦请教下,是用Socket来做吗?不是的话那么多人聊天,一直在判断请求,如何缓解服务器负担
      

  3.   

    这话问的cs还需要activex吗?
    资料
    看看牛人们写的
      

  4.   

    内容保存可使用XML,hashtable等
    web程序是无状态的,只能等Session过期
    Session退出时实现人数统计不准确。非法关机或关闭IE不会执行  
    要记录用户日志和操作时间,再用定时器刷新计算用户  
    已经有固定时间没有活动的用户,然后删除  
      

  5.   

    http://topic.csdn.net/u/20091210/11/6a048ed5-18b6-4b17-8f51-4e633281d3f9.html
      

  6.   

    也是在session_end事件中处理么,还是服务器上开一个线程循环去判断,每个用户的最后在线时间。
      

  7.   

    同样什么时候去,判断最后活动时间呢,session_end,还是开一个线程。
    内容保存,内存开辟两个静态链表。
    session我还不是很熟呀,要找找资料了。
    "非法关机或关闭IE不会执行",是不是session_End就不触发了
      

  8.   

    跟Session没有关系(除了SessionID以外)。你可以设置web.config,关闭SessionState,这样才能可靠地设计web服务器程序的状态。别忘记了,内存中的数据,包括Session集合等,随时会丢失的。例如每一个页面刷新的时候在数据库中记录会话的最后在线时间,那么在页面上定时在1分钟之后以Ajax方式访问一次后台,也就刷新了最后在线时间。很难说(其它人推荐的)那种让每一个页面都“死死拖住”web服务器的做法真正可以持久。反倒是,我惊讶地发现我每当运行我的web测试程序(每秒会刷新页面几次)访问网页,360安全卫士都会把我的url地址发到它的web服务器上并返回验证结果,它竟然每秒也重复发送好几次。这似乎证明同时连接数低于1万个不需要搞什么假的长连接(因为那并不是真正意义的长连接,而只是hang)。关于什么“不会一直刷数据库”,说实在地我对这些不太感冒。数据当然应该尽快更新到数据库,只不过写数据库的动作可以异步、后台线程来完成,而不影响写入缓存的动作。如果你因为不会异步操作而就想出“达到一定数量才写到数据库”,我对这样的设计则毫无信心。某些人把通信看做是把命令写入数据库和从数据库读取出来,那样的架构可以说毫无专业 IM 经验。现在什么年代?通信级的程序还以为服务器系统就是给客户端程序暴露出关系数据库就完了?你需要制定好通信协议,而客户端根本不用关心你的服务器端使用(或者根本没有使用)什么什么数据库。最后,除非还是模仿别人7、8年前的比较低级的web技术,否则没有必要使用瘦客户端平台来开发WebIM。RIA才是不二的选择。
      

  9.   

    整个项目是个 征婚网站 模仿世纪佳缘作的 ,里面有个功能是在线聊天 ,和CSDN里的站内消息差不多。
    也不想网上找代码改来改去的,打算自己实现。
      

  10.   

    sp1234 说的“。别忘记了,内存中的数据,包括Session集合等,随时会丢失的。”
    怎么解释,难道说asp_net会随时收回session么,或者asp_net随时可能当掉么(这个不会把),服务器频繁重启!。
    不理解
      

  11.   

    简单的流程:用户登陆- 记录session 和用户账户 
    定时发送心跳包- 如果有发给此用户的信息,取回
    如果长时间没心跳,或者登出 session end 清理资源