求一个WEB在线即时通
现在想做一个WEB在线即时通,就是当用户登录后就显示在线!然后可以聊天!
谁有这方面的资料也可以发上来!怎么设计会比较好点!比如聊天纪录保存等?
[解决办法]
给你个在线用户代码,你在加聊天功能吧。
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Data;using System.Configuration;using SDT.Info.Active;using SDT.Info;namespace SDT.Active.ActiveUser{ /// <summary> /// PassPort 存储在线用户列表。 /// </summary> public class PassPort { private static SortedList<int,ActiveUserInfo> _activeusers; private static List<UserEmployeeInfo> _userInfos; private static PassPort _instance; private static readonly object obj = new object(); /// <summary> /// 初始化在线用户表。 /// </summary> private void userstableFormat() { if (_activeusers == null) { _activeusers = new SortedList<int, ActiveUserInfo>(); _userInfos = new List<UserEmployeeInfo>(); } } public static PassPort Instance() { if (_instance == null) { _instance = new PassPort(); } return _instance; } public int ActiveTimeout { get { return Config.SysBaseConfig.GetInstance().ServoActiveTimeout; } } public int RefreshTimeout { get { return Config.SysBaseConfig.GetInstance().ServoActiveTimeout * 2; } } private PassPort() { userstableFormat(); } /// <summary> /// 获取全部用户列表 /// </summary> /// <returns></returns> public List<UserEmployeeInfo> GetActiveUsers() { return _userInfos; } /// <summary> /// 获取在线用户 /// </summary> /// <param name="sysNo">用户SysNo</param> /// <returns></returns> public UserEmployeeInfo GetActiveUserBySysNo(int sysNo) { return _userInfos.First( p => p.SysNo == sysNo); } /// <summary> /// 用户集合 /// </summary> /// <param name="userAttr">用户属性</param> /// <returns></returns> public List<UserEmployeeInfo> GetActiveUsersByUserAttr(AppEnum.UserAttr userAttr) { return _userInfos.Where(p => p.Attr == userAttr).ToList<UserEmployeeInfo>(); } /// <summary> /// 新用户登陆。 /// </summary> public void Login(UserEmployeeInfo userInfo) { DelTimeOut(); //清除超时用户 //若是单人登陆则注销原来登陆的用户 this.Logout(userInfo.SysNo); try { ActiveUserInfo activeUserInfo = new ActiveUserInfo(userInfo.SysNo,userInfo); _activeusers.Add(userInfo.SysNo, activeUserInfo); _userInfos.Add(userInfo); } catch (Exception e) { throw (new Exception(e.Message)); } } /// <summary> ///用户注销,根据Ticket或UserName。 /// </summary> public void Logout(int userSysNo) { DelTimeOut(); //清除超时用户 _activeusers.Remove(userSysNo); } /// <summary> ///清除超时用户。 /// </summary> private bool DelTimeOut() { DateTime dtNow = DateTime.Now; List<ActiveUserInfo> removeActiveUser = _activeusers.Values.Where(p => DateTime.Compare(p.RefreshTime, dtNow.AddSeconds(- RefreshTimeout)) < 0).ToList<ActiveUserInfo>(); foreach (ActiveUserInfo activeUser in removeActiveUser) { _activeusers.Remove(activeUser.SysNo); } return true; } /// <summary> ///更新用户活动时间。 /// </summary> public void ActiveTime(int userSysNo) { DelTimeOut(); if (_activeusers.ContainsKey(userSysNo)) { ActiveUserInfo activeUser = _activeusers[userSysNo]; activeUser.ActiveTime = DateTime.Now; activeUser.RefreshTime = DateTime.Now; } } }}
[解决办法]
怎样设计会好点?
如果你开发的小程序只能在一个很小的办公室里demo,那么其实其设计与实际产品可能完全不同。IM在这方面差别实在是太大了。有些培训机构的学生拿什么基于winform的“QQ”项目,他们的“加好友”功能是怎样加的呢?竟然是用户点击“曾加好友”按钮,然后程序去访问SQL Server数据库把用户都列出来,然后用户去选择,最后就增加到首界面的tree上了。这完全不是QQ的逻辑啊,我们加好友直接针对对方的QQ号发起了动作,我们的QQ可没有去访问什么SQL Server数据库,同时消息必须理解到达对方,对方有一个确认以及防骚扰流程,对方确认了的时候我们的程序(也许已经是两天以后了)可能弹出提示告诉我对方同意我加他了。这才是QQ的流程。
所以如何设计会好点?去理解人家实际的系统吧,去从通讯协议、而不是数据库增删改查的角度去设计系统吧。